ddu-异步处理

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 进行发送消息。

你可能感兴趣的:(ddu-异步处理)