由 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也可以在子线程中加载

猜你喜欢

转载自blog.csdn.net/reuxfhc/article/details/80823695