美文网首页
ddu-异步处理

ddu-异步处理

作者: 小董666 | 来源:发表于2016-07-13 16:05 被阅读0次

    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-异步处理

          本文链接:https://www.haomeiwen.com/subject/jmrljttx.html