Can't create handler inside thread that has not called Looper.prepare()

本文探讨了在Android应用中使用消息循环Handler时遇到的问题,详细解释了Looper对象的作用及其在消息循环中的重要性。通过实例展示了如何正确初始化Looper和Handler,并解决了无法接收消息的常见错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 最近在线程里写一个消息循环,代码大致如下(省去那些与主题无关的):

public void run() {

/*

*其他操作,这里省略

*/

   //初始化handler
   handler = new Handler() {
    
    public void handleMessage(android.os.Message msg) {
     /*
     //创建一个intent对象
     Intent intent = new Intent();
     intent.setClass(download_service.this, download_activity.class);
     //设置动作的类型
     intent.setAction(UPDATE_ACTION);
     //通过switch,判断消息的类型
      *
      */
     System.out.println("-------------->Handler启动成功");
     switch(msg.what) {
      case AttachmentUtil.BEGIN :
       System.out.println("--------------------->接受到消息类型BEGIN");
       break;
      case AttachmentUtil.LOADING:
       System.out.println("--------------------->接受到消息类型LOADING");
       break;
      case AttachmentUtil.FINISH:
       System.out.println("--------------------->接受到消息类型FINISH");
       break;
     }
     super.handleMessage(msg);
    }
   };


}

报了错Can't create handler inside thread that has not called Looper.prepare(),百度了下找到答案

Looper用于封装了android线程中的消息循环,默认情况下一个线程是不存在消息循环(message loop)的,需要调用Looper.prepare()来给线程创建一个消息循环,调用Looper.loop()来使消息循环起作用,从消息队列里取消息,处理消息。

注:写在Looper.loop()之后的代码不会被立即执行,当调用后mHandler.getLooper().quit()后,loop才会中止,其后的代码才能得以运行。Looper对象通过MessageQueue来存放消息和事件。一个线程只能有一个Looper,对应一个MessageQueue。


以下是Android API中的一个典型的Looper thread实现:

//Handler不带参数的默认构造函数:new Handler(),实际上是通过Looper.myLooper()来获取当前线程中的消息循环,
//而默认情况下,线程是没有消息循环的,所以要调用 Looper.prepare()来给线程创建消息循环,然后再通过,Looper.loop()来使消息循环起作用。


	class LooperThread extends Thread
	{
		public Handler mHandler;
		public void run() 
		{
			Looper.prepare();
			mHandler = new Handler() 
			{
				public void handleMessage(Message msg) 
				{
					// process incoming messages here
				}
			};
		Looper.loop();
	}


另,Activity的MainUI线程默认是有消息队列的。所以在Activity中新建Handler时,不需要先调用Looper.prepare()。
这个改后,虽然不报错了,但是依然接受不到消息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值