Handler定义:
主要接受子线程发送的数据,并用此数据配合主线程更新UI。
Handler用来解决的问题:
大家都知道,更新UI只能在主线程中更新,子线程中操作是危险的。这个时候,Handler就出现了。来解决这个复杂的问题,由于Handler运行在主线程中(UI线程中), 它与子线程可以通过Message对象来传递数据,这个时候,Handler就承担着接受子线程传过来的(子线程用sendMessage()方法传递)Message对象(里面包含数据),把这些消息放入主线程队列中,配合主线程进行UI更新。
Handler工作原理图:
图片来自网络
代码如下(这里用到了回调):
MainActivity:
package com.myhandlerdemo;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.widget.TextView;
/**
* Handler机制
*
* @author zhongyao
*
*/
public class MainActivity extends ActionBarActivity implements MyInterface {
public final static int SUCCESS = 0;
public final static String TAG = "yao";
public MyHandler handler;
private TextView tv1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
initHanlder();
new WorkThread(handler).start();
}
private void init() {
tv1 = (TextView) findViewById(R.id.tv1);
}
private void initHanlder() {
handler = new MyHandler(this);
}
@Override
public void RefreshUI(Object obj) {
tv1.setText(obj.toString());
}
}
MyHandler(这里使用的Handler是大家开始都习惯用的写法,但不是最佳,因为这可能会出现内存泄漏问题,有意向请查看我的另一篇文章Android Handler造成内存泄露的分析和解决):
package com.myhandlerdemo;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
public class MyHandler extends Handler {
MyInterface myInterface;
public MyHandler(MyInterface myInterface) {
this.myInterface = myInterface;
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Log.d(MainActivity.TAG, msg.obj.toString());
myInterface.RefreshUI(msg.obj);
}
}
WorkThread:
package com.myhandlerdemo;
import android.os.Handler;
import android.os.Message;
public class WorkThread extends Thread {
private Handler handler;
public WorkThread(Handler handler) {
this.handler = handler;
}
@Override
public void run() {
super.run();
/**
* 子线程耗时操作
*/
doTask();
}
private void doTask() {
Message msg = new Message();
msg.obj = "我是子线程获取过来的数据,该数据用于配合主线程更新UI界面";
handler.sendMessage(msg);
}
}
MyInterface:
package com.myhandlerdemo;
public interface MyInterface {
void RefreshUI(Object obj);
}
运行结果:
这样我们就通过Handler机制来处理了子线程去更新UI线程控件问题,Andrid开发中要经常用到这种机制。
参考: