新建一个线程去运行下载数据或数据查询的操作

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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章