Android Handler运行机制

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开发中要经常用到这种机制。

参考:

http://blog.csdn.net/lmj623565791/article/details/38377229

http://www.cnblogs.com/plokmju/p/android_handler.html

发布了95 篇原创文章 · 获赞 195 · 访问量 26万+

猜你喜欢

转载自blog.csdn.net/u012440207/article/details/51113340
今日推荐