首页 > 其他 > 详细

子线程上的handler处理

时间:2014-02-15 12:00:23      阅读:451      评论:0      收藏:0      [点我收藏+]

我想在子线程中创建一个handler

MainActivity:

	private static String TAG = MainActivity.class.getName();


	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		findViewById(R.id.button1).setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				new Thread(){
					public void run() {
						new HandlerTest().sendHandler();
						
					};
				}.start();
			}
		});
	}
 这个acitivy点击按钮然后调用handlerTest中的方法

public class HandlerTest {

	private static String TAG=HandlerTest.class.getName();
	
	Handler mHandler = new Handler(){
		@Override
		public void handleMessage(Message msg) {
			super.handleMessage(msg);
			Log.e(TAG,"handleMessage~~~~");
		}
	};
	
	public void sendHandler(){
		Log.e(TAG,"sendHandler~~~~");
		mHandler.sendEmptyMessage(1);
	}
}

好,现在我已经在子线程中写好了代码,然后运行结果出现了下面的问题:


bubuko.com,布布扣

我们没有准备looper.prepare,于是将代码改进为:

@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		findViewById(R.id.button1).setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				new Thread(){
					public void run() {
						Looper.prepare();
						Log.e(TAG, "Looper.prepare()~~~~");
						new HandlerTest().sendHandler();
						};
				}.start();
			}
		});
	}

在一次去查看log,这一次发现并没有报错

bubuko.com,布布扣

但是你会发现他发送了消息,但是handler并没有成功接收到。这是为什么了,因为这样做仅仅是搭建好了looper,但是并没有开启loop的消息循环。

于是再一次的改进代码:

@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		findViewById(R.id.button1).setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				new Thread(){
					public void run() {
						Looper.prepare();
						Log.e(TAG, "Looper.prepare()~~~~");
						new HandlerTest().sendHandler();
						Looper.loop();
					};
				}.start();
			}
		});
	}
查看log:

bubuko.com,布布扣

ok,这一次成功了,这样我们就大功告成了。有人会问为什么我们在主线程上面写不需要自己搭建了,你可以去看看源码,其实在main主函数中已经为我们初始化过了。


下面引用老罗的文章的一段话:

  在Android应用程序进程启动过程的源代码分析一文中,我们分析了Android应用程序进程的启动过程,Android应用程序进程在启动的时候,会在进程中加载ActivityThread类,并且执行这个类的main函数,应用程序的消息循环过程就是在这个main函数里面实现的,我们来看看这个函数的实现,它定义在frameworks/base/core/java/android/app/ActivityThread.java文件中:

public final class ActivityThread {
	......
	public static final void main(String[] args) {
		......
		Looper.prepareMainLooper();
		......
		ActivityThread thread = new ActivityThread();
		thread.attach(false);
		......
		Looper.loop();
		......
		thread.detach();
		......
	}
}


欢迎吐槽。

子线程上的handler处理

原文:http://blog.csdn.net/linhui9010/article/details/19193243

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!