前言:
惶恐啊,惶恐!真不想发这篇文章,说实话,姐还没有深入解析Looper+thread+handler机制的能力呢!!于是,心虚的我贴出几位大牛的博客地址,以供大家学习。
http://blog.csdn.net/luoshengyang/article/details/6817933(老罗)
http://www.cnblogs.com/codingmyworld/archive/2011/09/14/2174255.html(图文并茂)
好了,我的博客写完了!!!!哈哈,开个玩笑,我就假装还有很多人期待我的罗嗦。
异步线程的中心思想如下:
1.创建一个子线程,并且让它从一开始就运行。
2.获得子线程Looper。所谓的Looper相当与一个循环的消息队列,随时侯命处理各种任务。
3.创建一个Handler,并且将子线程的Looper赋给它,告诉它,它需要把任务交付给子线程的消息队列。这样主线程就省力了,它把重货累活都交给子线程,自己只负责UI方面的东西。这样就不会出现卡机的状况了。
4.最后,如果你再也不需要子线程了,千万别忘了mLooper.quit();
嘿嘿,是不是很简单,这就上代码!
HelloWorld.java
public class HelloWorld extends Activity{
/* * 百度了一下Volatile,说Volatile修饰的成员变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。 * 而且,当成员变量发生变化时,强迫线程将变化值回写到共享内存。 * 这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。 * */
private volatile Looper mLooper;
private volatile static MainHandler mMainHandler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
System.out.println("当前线程:++++++++ "+ Thread.currentThread().getId()); //打印出当前线程的ID
HandlerThread mHandlerThread = new HandlerThread("child_thread");
mHandlerThread.start();
mLooper = mHandlerThread.getLooper();
mMainHandler = new MainHandler(mLooper);
}
private final class MainHandler extends Handler {
public MainHandler(Looper mLooper) {
super(mLooper);
}
@Override
public void handleMessage(Message msg) {
System.out.println("当前线程:====== "+ Thread.currentThread().getId());
switch (msg.what) {
<干你想干的事情>
}
}
}
@Override
protected void onDestroy() {
super.onDestroy();
mLooper.quit(); //别忘了quit哦!
}
}
以上就是使用Looper的基本思想。突然想起来,我还得稍微扩展一些内容,HandlerThread 是直接引用系统的,有时候我们可能会自己写一个子线程,那可能需要对子线程进行更多的处理。
注意事项如下:
1.要先Looper.prepare(),创建一个消息队列。
2.才可以通过Looper.myLooper() 获得当前子线程的Looper。
3.上面示例中有mLooper = mHandlerThread.getLooper() ,那么我们在自定义的线程中最好也有这样的方法,能让外部可以get到子线程的Looper。
(1)声明一个Looper
Looper mLooper;
(2)获得当前的Looper()
public void run() {
Looper.prepare();
mLooper = Looper.myLooper();
<这里可以用Handler.....>
Looper.loop();
}
(3)创建getLooper方法以供外部使用。
public Looper getLooper(){
return mLooper;
}
4.还有就是Looper.loop()使消息循环起作用,从消息队列里取消息,处理消息。
5.最后嘛,别忘了quit一下。
呼!我的理解就到这了,但对我来说,够用了。写的也不够详细,还有很多地方没有考虑到,两年后的我,要是变牛了,一定要来补充一下啊!