1、 首先解释为什么AsyncTask必须在主线程中创建???
- 在《Android开发艺术探究》书中是这样解释的。由于AsyncTask使用到了主线程的Handler.为了能够将执行环境切换到主线程,这就要求Handler这个对象必须在主线程中创建。而这个Handler是AsyncTask的静态成员变量。由于静态成员会在加载类的时候进行初始化,因此这就变相要求AsyncTask的类必须在主线程中加载。
- 个人认为这个观点是错误的。
- 观点1:想要将执行环境切换到主线程,不一定非要在主线程创建Handler。只要在Handler创建的时候,使用UI线程的looper就可以。
如下代码所示:handler 可以在子线程中创建,由于创建的时候传递的是主线程的looper,所以handleMessage会交给主线程的消息循环处理。
- 观点1:想要将执行环境切换到主线程,不一定非要在主线程创建Handler。只要在Handler创建的时候,使用UI线程的looper就可以。
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也可以在子线程中加载