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

在Android开发中,遇到'Can't create handler inside thread that has not called Looper.prepare()'错误通常意味着不能在子线程中直接更新UI。解决方法是在子线程中使用Looper.prepare()并配合Handler进行消息传递。Handler允许在子线程中通过postMessage或sendMessage方法更新UI线程,Looper维护消息队列,而HandlerThread结合Looper提供线程同步。Message对象通过Bundle携带数据,通过Handler的handleMessage方法处理并更新UI。

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

   private Handler mHandler = new Handler(){  
            
            public void handleMessage(Message msg) {  
                switch (msg.what) {  
                case ID_USER:  
                         //获取传递的数据
                            //Bundle data = msg.getData();
                    //int count = data.getInt("COUNT");
                        //处理UI更新等操作
                }  
            };  
        };        

        只要在run()方法中加入 Looper.prepare()就可以解决问题了,但是出现这种问题的原因是因为Android中不能在子线程中来刷新UI线程。建议是在你的子线程中添加hander来发送消息更新线程。


   private Handler mHandler = new Handler(){  
            
            public void handleMessage(Message msg) {  
                switch (msg.what) {  
                case ID_USER:  
                         //获取传递的数据
                            //Bundle data = msg.getData();
                    //int count = data.getInt("COUNT");
                        //处理UI更新等操作
                }  
            };  
        };        
        在主activity中定一个Handler的成员,然后实现handlemassage函数,创建线程后在runable的run函数里new一个message,然后指定message对象的what成员,这个是指定message的一个id,然后在run中调用Handler的成员,使用其成员方法中的sendmessage,handlemassage函数中参数有个massage,根据该message参数中的what来对你发送message时指定的what来处理UI的功能

主activity中创建线程

     MyThread thread = new MyThread();              
                    mThread = new Thread(thread);
                    mThread.start();


MyThread  
 class MyThread implements Runnable {
            public void run() {     
                       //执行数据操作,不涉及到UI
                    Message msg = new Message();     
                msg.what = ID_USER;
                  //这三句可以传递数据
              //  Bundle data = new Bundle();
               // data.putInt("COUNT", 100);//COUNT是标签,handleMessage中使用
               // msg.setData(data);
                
                mHandler.sendMessage(msg); // 向Handler发送消息,更新UI 
             }

        通过一个Handler来处理这些,可以在一个线程的run方法中调用handler对象的 postMessage或sendMessage方法来实现,Android程序内部维护着一个消息队列,会轮训处理这些。 Looper又是什么呢? ,其实Android中每一个Thread都跟着一个Looper,Looper可以帮助Thread维护一个消息队列,但是Looper和Handler没有什么关系,我们从开源的代码可以看到Android还提供了一个Thread继承类HanderThread可以帮助我们处理,在HandlerThread对象中可以通过getLooper方法获取一个Looper对象控制句柄,我们可以将其这个Looper对象映射到一个Handler中去来实现一个线程同步机制,Looper对象的执行需要初始化Looper.prepare方法就能解决上面提到的问题。Message 在Android是什么呢? 对于Android中Handler可以传递一些内容,通过Bundle对象可以封装String、Integer以及Blob二进制对象,我们通过在线程中使用Handler对象的    sendEmptyMessage或sendMessage方法来传递一个Bundle对象到Handler处理器。对于Handler类提供了重写方法handleMessage(Message msg) 来判断,通过msg.what来区分每条信息。将Bundle解包来实现Handler类更新UI线程中的内容实现控件的刷新操作。相关的Handler对象有关消息发送sendXXXX相关方法如下,同时还有postXXXX相关方法,一个为发送后直接返回,一个为处理后才返回

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值