ps:这是关于Android Handler 机制的第一篇文章,主要来说一下Handler的用法,本文尽量归纳完全,如有缺漏,欢迎补充。
Handler的主要作用是切换线程,以及隐式的充当接口回调的作用,当子线程网络请求结束后,通过handler发送消息给主线程,这一点都不多说了。
常用用法
先来贴一种最常用的用法:
private Handler mHandler = new Handler() {
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
//...处理逻辑
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.bt_1).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mHandler.sendEmptyMessage(MainActivity.HANDLER_MAIN_CODE);
}
});
这种方法是大家最常用的,使用Handler的匿名内部类,去覆写handleMessage方法,来处理当消息到达时所做出的反应。这里埋一个伏笔:
这里IDEA在提示可能会发生内存泄漏,具体为什么会发生内存泄漏,针对问题的具体分析以及最后封装SafeHandler,我会在第三篇Handler文章中讲述。
Message
Message是Handler发送的消息的数据载体。
先看一下Message,Message用来承载数据,承载数据的实现是Message的几个public的成员变量:
public int what;
public int arg1;
public int arg2;
public Object obj;
- what: 这是一个int类型的变量,通常用来在handleMessage处做判断,当一个handler发送多条message时,用来辨别这是哪一条消息
- arg1,arg2,当发送的Message需要承载的data是整数时,可以简单的使用这两个参数来承载。
- Obj,这是一个Object对象,因为有这个变量,我们所能承载的data就多样化了,只要是对象都可以通过message传递,List、数组等等。
另外Message还提供了通过Bundle来传递数据:
Bundle也是一个数据载体,这里就不多说了。
/**
* Like getData(), but does not lazily create the Bundle. A null
* is returned if the Bundle does not already exist. See
* {@link #getData} for further information on this.
* @see #getData()
* @see #setData(Bundle)
*/
public Bundle peekData() {
return data;