子线程上的handler处理

我想在子线程中创建一个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);
	}
}

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



我们没有准备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,这一次发现并没有报错


但是你会发现他发送了消息,但是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:

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();
		......
	}
}


欢迎吐槽。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值