`

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

 
阅读更多

转于:http://blog.csdn.net/a7a9a68/article/details/7841762

 

-----------------------------------------------------------------------------------

 

  1. private Handler mHandler = new Handler(){    
  2.            
  3.          public void handleMessage(Message msg) {    
  4.              switch (msg.what) {    
  5.              case ID_USER:    
  6.                       //获取传递的数据  
  7.                          //Bundle data = msg.getData();  
  8.                  //int count = data.getInt("COUNT");  
  9.                      //处理UI更新等操作  
  10.              }    
  11.          };    
  12.      };          

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

 

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

 

主activity中创建线程

  1. MyThread thread = new MyThread();                
  2.                mThread = new Thread(thread);  
  3.                mThread.start();  


MyThread  

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

        通过一个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相关方法,一个为发送后直接返回,一个为处理后才返回

分享到:
评论

相关推荐

    开新线程引发的常见3个异常

    开一个新线程,引起的异常。1. ANR: application not responding 2.android.view.ViewRoot$...3.java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()

    Android开发中Looper.prepare()和Looper.loop()

    在Android开发中,`Looper`、`Looper.prepare()` 和 `Looper.loop()` 是处理线程间通信和异步任务的关键组件。它们与`Message`和`Handler`一起构成了Android的消息传递机制。默认情况下,一个线程并没有内置的消息...

    Android 高级开发面试题以及答案整理

    当在非UI线程(子线程)中创建`Handler`时,如果没有调用`Looper.prepare()`,程序将抛出异常:“Can't create handler inside thread that has not called Looper.prepare()”。这是因为`Handler`依赖于`Looper`来...

    Android+高级开发面试题以及答案整理.pdf

    在创建 Handler 对象时,如果不在主线程中创建,而是在子线程中创建,会导致程序崩溃,提示的错误是 Can't create handler inside thread that has not called Looper.prepare()。这是因为子线程中没有调用 Looper....

    阿里、腾讯等一线互联网大厂Android 高级开发面试题以及答案整理(1307页).pdf

    当创建一个新的Handler实例时,如果在子线程中没有事先调用Looper.prepare()来初始化Looper,会抛出“Can't create handler inside thread that has not called Looper.prepare()”异常。这是因为Handler需要一个...

    Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系 - Hongyang -

    "Can't create handler inside thread that has not called Looper.prepare()"); } mQueue = mLooper.mQueue; ... } ``` 3. **Message** Message是消息的载体,用于在Handler和Looper之间传递数据。它包含了...

    线程消息传送机制源码

    1. 在创建Handler时,如果当前线程没有Looper,会抛出`java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()`。这说明Handler必须在有Looper的线程中使用,例如...

    Handler + Thread + Looper

    在Android应用开发中,Handler、Thread和Looper是三个至关重要的组件,它们共同构成了Android线程间通信的基础架构。本文将详细解析这三个概念及其相互关系,旨在帮助开发者理解它们的工作原理和实际应用场景。 ...

    Android线程模式(handler,thread,looper)

    本文将深入探讨Android中的三种主要线程模式:Handler、Thread以及Looper,并结合源码分析它们的工作原理。 首先,我们来理解一下Android应用的基本运行环境。Android系统默认在主线程(UI线程)中执行所有的用户...

    解决Handler processing failed; nested exception is java.lang.NoClassDefFoundError_kmode exception

    标题 "解决Handler processing failed; nested exception is java.lang.NoClassDefFoundError_kmode exception" 指出的问题,是Java开发中常见的错误,通常发生在运行时。这个错误表明系统在尝试执行某个类时找不到...

    Handler与AsyncTask,Looper使用示例

    handler.sendMessage(msg); Looper.loop(); // 保持子线程的消息循环 } }).start(); // 使用AsyncTask的例子 class MyTask extends AsyncTask, Integer, String> { @Override protected String doInBackground...

    Android Looper使用介绍

    在 run() 方法中,我们首先调用 Looper.prepare() 方法来创建 Looper 对象,然后创建一个 Handler 对象,并将其与 Looper 对象关联。最后,我们调用 Looper.loop() 方法来处理消息循环。 通过使用 Looper 对象,...

    安卓Android源码——HandlerLooper2.rar

    在安卓开发中,`Handler`、`Looper`和`MessageQueue`是三个核心组件,它们共同构成了Android消息处理机制,用于实现线程间的通信。这个压缩包“安卓Android源码——HandlerLooper2.rar”可能包含了关于这些组件的...

    Thread,Looper,Handler,Message,MessageQueue,MessagePool之间的关系

    这些组件之间的交互过程大致如下:子线程中的Handler通过Looper.prepare()和Looper.loop()建立消息循环,然后使用Message.obtain()创建Message,设置数据和目标Handler,最后通过Handler.sendMessage()将Message放入...

    handler与looper及messagequeue的简单总结

    在Android开发中,Handler、Looper和MessageQueue是用于实现线程间通信的关键组件,它们共同构建了一个消息处理机制。理解这三个概念以及它们之间的关系对于优化应用程序的性能和响应性至关重要。 Handler(处理器...

    应用源码之HandlerLooper2.zip

    在Android系统中,`Handler`、`Looper`和`MessageQueue`是三个核心组件,它们共同构成了Android消息处理机制,使得应用程序能够实现线程间的通信和异步任务处理。本资料"应用源码之HandlerLooper2.zip"显然是针对这...

    Handler+Looper+MessageQueue

    `CustomThread` 类继承自 `Thread` 并重写了 `run()` 方法,在 `run()` 中调用了 `Looper.prepare()` 和 `Looper.loop()`,使线程具备了处理消息的能力。`mHandler` 是在主线程中创建的 Handler 实例,它用来发送...

    Android单线程模型中Message、Handler、Message Queue、Looper之间的关系---附实例源码

    Handler获取当前线程中的looper对象,looper用来从存放Message的MessageQueue中取出Message,再有Handler进行Message的分发和处理. 简单定义: 1、Message Queue(消息队列): 用来存放通过Handler发布的消息,通常...

    应用源码之HandlerLooper1.zip

    若要在其他线程使用`Handler`,必须先调用`Looper.prepare()`初始化`Looper`,然后调用`Looper.loop()`启动消息循环。 `MessageQueue`是消息队列,负责存储`Handler`发送的消息。每当`Handler`发送一个消息,`...

Global site tag (gtag.js) - Google Analytics