新建一個線程去運行下載數據或數據查詢的操作

1。 新建一個SingleThreadExecutor,用這種而不是用線程池的好處,就是不用管引用變量的線程,不用上鎖,避免循環死鎖

            config.executorService = Executors.newSingleThreadExecutor();

2。 新建一個Runnable對象,執行execute方法,將runnable的內容引入這個線程中去執行

  instance.singleExecutorService.execute(new Runnable() {
            @Override
            public void run() {
                Bifrost.globalApplication.unregisterActivityLifecycleCallbacks(mActivityLifecycleCallbacks);
                BFRuleMgr.getInstance().clearEnableRules();
                if((BFNetworkMonitor.networkChangeReceiver != null) && (Bifrost.globalApplication != null)){
                    BFNetworkMonitor.unRegisterNetworkReceiver(Bifrost.globalApplication);
                }
            }
        });

3。這個線程異於主線程,因此不會阻塞主線程的操作,但是也有缺點,主要表現在在非主線程中不能直接使用handler,和toast等跟UI有關的操作,如果要使用handler,必須先調用Looper.prepare(),和Looper.loop()方法,因爲一個handler發送消息隊列需要有一個已經定義好的looper,主線程已經定義好,因此可以不用。另外,同一個數據如arraylist等不能同時在兩個線程中引用和修改,否則會出現線程間修改數據的衝突。解決辦法有兩種
(1)在主線程中,將耗時的操作拋入異步線程中,具體方法如上;
(2)在一部線程中,將代碼拋入主線程中

獲得一個主線程的handler

 private static Handler mainHandler = new Handler(Looper.getMainLooper());
  private void startRuleInMainLooper(final BFRule ruleObserver) {
        if (Looper.myLooper() == Looper.getMainLooper()) {
            ruleObserver.startRule();    //含有conditionName的rule,重新start
        } else {
            Bifrost.getMainHandler().post(new Runnable() {
                @Override
                public void run() {
                    ruleObserver.startRule();
                }
            });
        }
    }

如下定時器

 Handler timeHandler = new Handler(Looper.getMainLooper()) {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case MSG_TIME:
                    BFRuleMgr.getInstance().updateCurrentRules(BFConstant.CONDITION_TIME);
                    break;
            }
            super.handleMessage(msg);
        }
    };

*需要注意的是:
在異步線程中執行代碼的時候,不能嵌套多層拋入,因爲這樣可能引起代碼運行時序錯亂,導致邏輯錯誤。*

發佈了74 篇原創文章 · 獲贊 3 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章