由 AsyncTask 必须在主线程中创建引发的思考

1、 首先解释为什么AsyncTask必须在主线程中创建???

  • 在《Android开发艺术探究》书中是这样解释的。由于AsyncTask使用到了主线程的Handler.为了能够将执行环境切换到主线程,这就要求Handler这个对象必须在主线程中创建。而这个Handler是AsyncTask的静态成员变量。由于静态成员会在加载类的时候进行初始化,因此这就变相要求AsyncTask的类必须在主线程中加载。
  • 个人认为这个观点是错误的。
    • 观点1:想要将执行环境切换到主线程,不一定非要在主线程创建Handler。只要在Handler创建的时候,使用UI线程的looper就可以。
      如下代码所示:handler 可以在子线程中创建,由于创建的时候传递的是主线程的looper,所以handleMessage会交给主线程的消息循环处理。
 new Thread(new Runnable() {
            @Override
            public void run() {
                Handler handler = new Handler(Looper.getMainLooper()) {
                    @Override
                    public void handleMessage(Message msg) {
                        switch (msg.what) {
                            case 1:
                                Log.d("lichaojun", "handleMessage: " + Thread.currentThread());
                                break;

                            default:
                                break;
                        }
                    }
                };
                handler.sendEmptyMessage(1);
            }
        }).start();`
 - 观点2:观点1的解释,也就说明了AsyncTask可以在子线程中加载。虽然handler是静态成员,但是根据观点1的解释,Handler也可以在子线程中加载
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值