AsyncTask
- 最开始不能并行,一次只能执行一个任务。
- 1.6后支持同时5个,那么第6个就要等待,知道2.3之前都是这。
- 从Android3.0开始对AsyncTask的API作出了一些调整:每次只启动一个线程执行一个任务,完成之后再执行第二个任务,也就是相当于只有一个后台线程在执行所提交的任务。
1.生命周期
AsyncTask会一直执行,直到doInBackground()方法执行完毕。如果cancel(boolean)被调用,那么onCancelled(Result result)方法会被执行;否则,执行onPostExecute(Result result)方法。如果我们的Activity销毁之前,没有取消AsyncTask,这有可能让我们的AsyncTask崩溃(crash)。因为它想要处理的view已经不在了。所以,我们总是必须确保在销毁活动之前取消任务。activity退出时取消任务。如果activity销毁,
AsyncTask还在后台运行就会造成 内存泄漏.
2.屏幕旋转
屏幕旋转或Activity在后台被系统杀掉等情况会导致Activity的重新创建,之前运行的AsyncTask会持有一个之前Activity的引用,这个引用已经无效,这时调用onPostExecute()再去更新界面将不再生效。
3.并行还是串行
在Android1.6之前的版本,AsyncTask是串行的,在1.6至2.3的版本,改成了并行的。在2.3之后的版本又做了 修改,可以支持并行和串行,当想要串行执行时,直接执行execute()方法,如果需要执行executeOnExecutor(Executor)。
Handle Thread
Looper Handle Thread MessageQue..
一个Handle绑定一个Looper对象,Looper 负责分法对应的message;
主线程有默认的looper关联
一.
1.子线程向主线程发送消息,获取Handle;
Handler myHandle =new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
switch (msg.what){
case 0:
Bundle bundle=msg.getData();
bundle.getString("s");
break;
}
return false;
}
});
2.建立子线程,使用主线程的handle发送message;
new Thread(new Runnable() {
@Override
public void run() {
Message message = myHandle.obtainMessage();
message.what=0;
Bundle bundle=new Bundle();
bundle.putString("ni","dae");
message.setData(bundle);
message.sendToTarget();
}
});
二.
1.主线程向子线程发送消息
子线程默认没有关联Looper,Looper.prepare();Looper.loop();
public class LoopThread implements Runnable {
public Handler mHandler = null;
@Override
public void run() {
Looper.prepare();
mHandler = new Handler() {
public void handleMessage(Message msg) {
Log.i("test", "handler"+result);
}
};
Looper.loop();
}
}
在主线程中使用 LooperThread.mHandle 进行发送消息。
网友评论