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

来源:互联网 发布:oracle的sql developer 编辑:程序博客网 时间:2024/05/16 05:34

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);        }    };

*需要注意的是:
在异步线程中执行代码的时候,不能嵌套多层抛入,因为这样可能引起代码运行时序错乱,导致逻辑错误。*

0 0
原创粉丝点击