android的消息处理大家都知道是用Handler,Message,Looper。关于Message和Handler之间的定义就不多讲了,网上有很多。今天主要来讲一下利用ThreadLocal来传递Handler对象进行多线程,多类之间进行通信。
利用Handler进行多线程通信时,Handler会把消息传给Looper的消息队列,而Looper的消息队列是属于UI线程的消息队列。所以我们往消息队列里面发送消息,其实是往UI线程的消息队列里发送消息。
ThreadLocal,很多地方叫做线程本地变量,也有些地方叫做线程本地存储,其实意思差不多。ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。
在JDK5.0中,ThreadLocal已经支持泛型,该类的类名已经变为ThreadLocal<T>。API方法也相应进行了调整,新版本的API方法分别是void set(T value)、T get()以及T initialValue()。那么,支持Handler应该是没有问题的咯。
自定义一个ThreadLocal类来支持Handler,代码如下:
public class HandlerManager {
private static ThreadLocal<Handler> threadLocal = new ThreadLocal<Handler>();
public static Handler getHandler() {
return threadLocal.get();
}
public static void putHandler(Handler value) {
threadLocal.set(value);//UiThread id
}
}
在Activity中进行调用
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
HandlerManager.putHandler(handler);
init();
}
private Handler handler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
}
}
};
}
在子线程中,调用如下代码
HandlerManager.getHandler().sendEmptyMessage(int what);
就可以了,是不是觉得处理流程清晰简单多了。