异步消息处理机制总结(AsynTask和handler)

       写了几篇博客,感觉挺充实的,虽然技术含量不高,其中错误肯定也不少,理解并不深入,但是也算是对自己学习一步一个脚印的交代,毕竟自己是一个本科大三狗,如果能坚持写写博客,研究下技术,将来也能增强 实力为自己找到工作。望大神指点,新手共勉。

      今天开始这篇博客前我想先表达一下我的规划,目前的博客水平,包括我现在阶段的任务,是学会怎么用这些知识,但是我也在学习如何看源码,如何理解思想和框架,因为那些才是最重要的,我个人的想法是控件——各种机制——各种框架———源码——设计思想,然后再从应用层慢慢往下走,所以同时我也鞭策自己要学好linux。所以现阶段的博客我会尽量在文章后面,贴出大神们的深入源码的分析,以供爱好者和未来的自己深入了解。


      废话不多说,今天要总结的是异步消息处理机制,这个东西很常见,也很实用。基本上我现在了解到的就是有两种,一种是handler+thread,一种是asyntask,handler+thread是最基础的,而后者是对它的封装和简化(我看过源码= = 有点不懂,但看到了handler的影子)。


先来讲稍微简单的asyntask,首先的找个类继承它,这里我们定义了一个myAsynTask类,并重写了里面几种方法。

public class myAsnytask extends AsyncTask {


    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }
    @Override
    protected boolean doInBackground(Void... params) {
        publishProgress();    //调用了这个方法才能实现第三个方法
        return false;
    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        super.onProgressUpdate(values);
    }

    @Override
    protected void onPostExecute(boolean b) {
        super.onPostExecute(b);
    }
}


 
  

常用的有这四个i方法,用大白话解释一下,第一个方法是在进入子线程时预先要做的准备动作代码,可以写在这里,pre嘛,准备的缩写词。

第二个方法是background,顾名思义,就是在子线程里的,这里专门执行那些耗时的操作,比如网络请求,数据解析之类的哦。

第三个方法嘛,是在子线程处理耗时任务时,可以返回一些信息,在页面上显示,比如进度条啊之类的,但是好像是此时任务在进行中的。

第四个方法,是子线程耗时任务处理完毕后,执行这个方法,这个方法相当于在主线程中,因此可以更新UI,把处理后的数据呈现出来。

最后,我们如下调用执行方法,便可以启动。

new myAsnytask().execute();

接下来要介绍第二种方法,就是handler+thread方法,这种方法的思想在于,在主线程放置一个待执行的代码块,然后在子线程中处理耗时处理,等任务处理完毕,发送一个信息给主线程,主线程中的代码块被触发,然后在这个执行这个代码块,这个代码块通常是UI操作,而连接这两者的就是Message。主线程中new了一个handler对象,里面重写handlermessage方法,在子线程中,handler对象利用sendMessage方法把Message发出来,从而触发handlerMessage。

当然听起来简单,这是最基础的使用而已,其实异步消息机制除了handler.message,还有MessageQueue和Looper,MessageQueue就是消息队列的意思,而Looper你可以理解为这个消息队列的管理员,每次都把消息拿出来给handlerc处理,handler就是专门处理,虐待Message的(= = 说过头了)。

贴上代码,首先我在主线程中放置一个代码块。

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.button).setOnClickListener(this);
    }


     private  Handler handler = new Handler() {
         @Override
         public void handleMessage(Message msg) {
             switch (msg.what){
                 case 1:
                     break;
                 case 2:
                     break;
             }
         }
     };


 这里我并没有做什么操作,这是为了展示给大家看哈。 
  

然后我在按钮的点击事件里,开辟了子线程。

    @Override
    public void onClick(View v) {
    /*
    *以下是通过handler+thread方法处理处理异步消息
    * */
        new Thread(new Runnable() {
            @Override
            public void run() {
                Message message = Message.obtain();   //两种获得对象的方式,官方好像推荐这种
                Message message1 = new Message();
                message.what=1;
                message1.what=2;
                handler.sendMessage(message);
                handler.sendMessage(message1);
            }
        }).start();

        new myAsnytask().execute();

    }
}


 可以看到,这里我分别执行了两种不同的异步消息处理机制的方法,AsynTask是直接使用,而handler是获取Message对象,然后通过方法把消息发出去和在主线程中触发并匹配相应的消息,从而执行相应的动作。 
  

本人的总结大概就有这么多,还有一些是比较模糊的,因此也不敢写出来,以下是我翻阅网络的相关资源,有助于我们进一步深入异步消息处理机制,成长为大牛。

Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系,大神博客

Android AsyncTask 从源码深入解析

知乎上关于异步消息处理机制的面试

两种异步方式实现的区别

 
  


你可能感兴趣的:(安卓)