写了几篇博客,感觉挺充实的,虽然技术含量不高,其中错误肯定也不少,理解并不深入,但是也算是对自己学习一步一个脚印的交代,毕竟自己是一个本科大三狗,如果能坚持写写博客,研究下技术,将来也能增强 实力为自己找到工作。望大神指点,新手共勉。
今天开始这篇博客前我想先表达一下我的规划,目前的博客水平,包括我现在阶段的任务,是学会怎么用这些知识,但是我也在学习如何看源码,如何理解思想和框架,因为那些才是最重要的,我个人的想法是控件——各种机制——各种框架———源码——设计思想,然后再从应用层慢慢往下走,所以同时我也鞭策自己要学好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();
}
}
本人的总结大概就有这么多,还有一些是比较模糊的,因此也不敢写出来,以下是我翻阅网络的相关资源,有助于我们进一步深入异步消息处理机制,成长为大牛。
Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系,大神博客
Android AsyncTask 从源码深入解析
知乎上关于异步消息处理机制的面试
两种异步方式实现的区别