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()); } }
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); } }
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); } }
package com.myhandlerdemo; public interface MyInterface { void RefreshUI(Object obj); }运行结果:
这样我们就通过Handler机制来处理了子线程去更新UI线程控件问题,Andrid开发中要经常用到这种机制。
参考:
http://blog.csdn.net/lmj623565791/article/details/38377229
http://www.cnblogs.com/plokmju/p/android_handler.html