Handler一般用于在工作线程(子线程)中去更新UI线程(主线程)的数据,如更新某个View的状态、刷新界面、弹出对话框等。为什么要使用Handler呢?什么时候需要使用工作线程呢?在开发中,一些比较耗时的操作,如大文件读写,数据库操作以及网络下载需要很长时间,如果全部在主线程中处理,会造成界面很卡,而且很容易出现ANR的响应提示窗口,这个时候我们可以考虑创建一个工作线程(继承Thread类或者实现Runnable接口)来解决。但是对于Android平台来说UI线程不是线程安全的,使用工作线程更新UI会出现异常,所以需要引入一些同步的机制来处理,Handler因此就产生了。可以在UI线程中创建一个Handler对象,实现它的handleMessage(Message msg)方法,它与工作线程中间通过Message来传递数据。本文只简单的讲述handler的使用,下一篇将详细讲述Android的消息处理机制。

下面我们通过一个简单的demo来了解hander的实际使用。该demo通过一个子线程更新TextView的值。
MainActivity.java

public class MainActivity extends Activity {

	private TextView mTextView;
	private Button mButton;
	private static final int UPDATE_TEXTVIEW = 0;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        mTextView = (TextView)this.findViewById(R.id.textview);
        mButton = (Button)this.findViewById(R.id.button);

        mButton.setOnClickListener(new OnClickListener() {

			public void onClick(View v) {
				Thread t = new Thread(new UpdateThread());
				t.start();
			}
		});
    }

    private Handler mHandler = new Handler(){
    	public void handleMessage(Message msg) {
    		switch(msg.what) {
    		case UPDATE_TEXTVIEW:
    			mTextView.setText("尼玛,敢改我的值~~");
    			break;
    		}

    	}

    };

    private class UpdateThread implements Runnable {

		public void run() {
			Message msg = mHandler.obtainMessage();
			msg.what = UPDATE_TEXTVIEW;
			msg.sendToTarget();
		}

    }

}

点击更新按钮,会发现TextView的值已被更改。如果不使用handler会出现什么情况?现在把run方法里的代码注释掉,然后把给TextView赋值的代码放到run方法里,点击更新按钮,会出现下面的异常。
android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

android使用tcpdump抓包

最近游戏在接qq opensdk的时候调用一个cgi一直不成功,文档描述太简单,我们调用的又是互娱这边msdk的api,由msdk调用opensdk相关api,中间跨了两部门,为了...

阅读全文

Android.mk文件解读

我们在Android平台写c/c++程序的时候需要用到Android.mk(Makefile),一般用来编译c/c++源码、引用第三方头文件和库,生成程序所需的so文件。下面是一个cocos2...

阅读全文

Android性能优化案例研究(下)

去掉冗余的图层 为 了去掉重绘我们必须首先理解它从哪里产生的。这就轮到Hierarchy Viewer和Tracer for OpenGL大显身手的时候了。Hierarchy Viewer是ADT工具...

阅读全文

2 条评论

欢迎留言