`

java.lang.RuntimeException: Can't create handler inside thread that has not cal

 
阅读更多

http://hi.baidu.com/donghaozheng/item/dc843d149968bf6e70d5e8e4

(1) Looper类别用来为一个线程开启一个消息循环。默认情况下Android中新诞生的线程是没有开启消息循环的。(主线程除外,主线程系统会自动为其创建Looper对象,开启消息循环)

Looper对象通过MessageQueue来存放消息和事件。一个线程只能有一个Looper,对应一个MessageQueue。

 

 

 

(2) 通常是通过Handler对象来与Looper交互的。Handler可看做是Looper的一个接口,用来向指定的Looper发送消息及定义处理方法。

默认情况下Handler会与其被定义时所在线程的Looper绑定,比如,在主线程中定义,其是与主线程的Looper绑定。

mainHandler = new Handler() 等价于new Handler(Looper.myLooper()).

Looper.myLooper():Return the Looper object associated with the current thread 获取当前进程的looper对象。

还有一个类似的 Looper.getMainLooper() 用于获取主线程的Looper对象。

 

 

 

 

(3) 在非主线程中直接new Handler() 会报如下的错误:

E/AndroidRuntime( 6173): Uncaught handler: thread Thread-8 exiting due to uncaught exception
E/AndroidRuntime( 6173): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()

原因是非主线程中默认没有创建Looper对象,需要先调用Looper.prepare()启用Looper。

 

 

 

(4) Looper.loop(); 让Looper开始工作,从消息队列里取消息,处理消息。

注意:写在Looper.loop()之后的代码不会被执行,这个函数内部应该是一个循环,当调用mHandler.getLooper().quit()后,loop才会中止,其后的代码才能得以运行。

 

 

 

 

(5) 基于以上知识,可实现主线程给子线程(非主线程)发送消息。

把下面例子中的mHandler声明成类成员,在主线程通过mHandler发送消息即可。

 

 

 

(6) Android官方文档中Looper的介绍:

Class used to run a message loop for a thread. Threads by default do not have a message loop associated with them; to create one, call in the thread that is to run the loop, and then to have it process messages until the loop is stopped.

Most interaction with a message loop is through the class.

This is a typical example of the implementation of a Looper thread, using the separation of and to create an initial Handler to communicate with the Looper.

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

分享到:
评论
1 楼 臧殿彬 2016-06-24  
为什么我在主线程中定义也会出现这个bug?

相关推荐

    解决 java.lang.RuntimeException: Could not generate DH keypair异常处理所需的bcprov的jar

    解决 java.lang.RuntimeException: Could not generate DH keypair异常处理。 bcprov-ext-jdk15on-1.60、bcprov-jdk15on-1.60两个包放到jre下的$JAVA_HOME/jre/lib/ext的路径下,然后配置$JAVA_HOME/jre/lib/...

    java.lang.RuntimeException: Unsupported algorithm: HmacSHA1解决方法

    java.lang.RuntimeException: Unsupported algorithm: HmacSHA1 解决方法,阿里云

    java.lang.runtimeexception unexpected subelement

    在Java编程中,`java.lang.RuntimeException` 是一个非检查异常(unchecked exception),它表示程序运行时出现的不正常情况。通常,这类异常是由于程序员的错误或代码逻辑的疏忽造成的,例如类型转换错误、空指针...

    javax.net.ssl.SSLException: java.lang.RuntimeException: Could not generate DH keypair 解决方法总结

    然而,当你遇到“javax.net.ssl.SSLException: java.lang.RuntimeException: Could not generate DH keypair”的错误时,这意味着在建立SSL/TLS连接时,Diffie-Hellman(DH)密钥交换算法遇到了问题。DH是一种非对称...

    java.lang.OutOfMemoryError: Java heap space 解决方法

    ### Java.lang.OutOfMemoryError: Java Heap Space 解决方法详解 在Java开发与运维中,`java.lang.OutOfMemoryError: Java heap space`是一个常见的错误信息,它表明JVM(Java虚拟机)的堆内存已经耗尽,无法再分配...

    反复重启无法进入桌面log

    2352): java.lang.RuntimeException: Unable to create service com.android.systemui.keyguard.KeyguardService: java.lang.SecurityException: read wallpaper: Neither user 10044 nor current process has ...

    ssl报错解决generate DH keypair.zip

    加密是报:javax.net.ssl.SSLException: java.lang.RuntimeException: Could not generate DH keypair 此处提供 bcprov-ext-jdk15on-154.jar 和 bcprov-jdk15on-154.jar 压缩包中有使用说明

    java.lang.OutOfMemoryError解决办法

    Java中的`java.lang.OutOfMemoryError`是一种常见的运行时错误,通常表示应用程序在尝试分配内存时遇到了问题。根据提供的信息,这个错误主要涉及到两个方面:`PermGen space`和`Java heap`,并且与Tomcat服务器相关...

    SQL Server 建立安全连接。错误:“java.lang.RuntimeException: Could not generate DH keypair”

    1、修改jdk/jre/lib/security/java.security,加粗部分放到最前面,其它依次修改编号放到后面 security.provider.1=org.bouncycastle.jce.provider.BouncyCastleProvider security.provider.2=sun.security....

    (最终解决)java.lang.UnsatisfiedLinkError解决尝试

    Java中的`java.lang.UnsatisfiedLinkError`是一个常见的运行时异常,通常出现在Java试图加载本地(C或C++)库但找不到相应的库文件时。这个错误可能是由于多种原因引起的,如库路径设置不正确、库文件不存在或者版本...

    java.lang.UnsupportedOperationException异常(csdn)————程序.pdf

    `java.lang.UnsupportedOperationException`是Java中的一个运行时异常,它属于`RuntimeException`的子类。这个异常通常在尝试调用一个不支持的操作时抛出。在Java编程中,某些方法可能在特定对象或特定条件下不支持...

    WebLogic错误 java.lang.AssertionError: Registered more than one

    Caused by: java.lang.RuntimeException: javax.management.remote.JMXServerErrorException: java.lang.AssertionError: Registered more than one instance with the same objectName : com.bea:Name=wl04,Type=...

    解决Could not generate DH keypair

    加密是报:javax.net.ssl.SSLException: java.lang.RuntimeException: Could not generate DH keypair 此处提供 bcprov-ext-jdk15on-154.jar 和 bcprov-jdk15on-154.jar 压缩包中有使用说明

    中文分词器

    开发者可以编写Java程序,利用数据结构和算法知识来构建Trie树、生成DAG、实现动态规划算法以及HMM和Viterbi算法。"SemanticAnalysisDemo"这个文件名可能是一个演示性的分词程序,它可能包含了以上所述的全部功能,...

    java.lang.IllegalArgumentException:Input == null的异常处理

    java.lang.ExceptionInInitializerError Caused by: java.lang.IllegalArgumentException: input == null! at javax.imageio.ImageIO.read(ImageIO.java:1388) at com.pleanwar.fiying.FlyingObject.loadImage...

    java.sql.SQLException: 结果集已耗尽

    在Java编程中,`java.sql.SQLException: 结果集已耗尽` 是一个常见的错误提示,通常出现在处理数据库查询结果集时。这个异常表明程序试图访问已经没有数据的结果集中下一行,即所有行已经被遍历完,尝试访问超出范围...

    Android 兼容性问题:java.lang.UnsupportedOperationException解决办法

    "Android 兼容性问题:java.lang.UnsupportedOperationException解决办法" Android 兼容性问题:java.lang.UnsupportedOperationException解决办法是 Android 开发中常见的一种问题。该问题会导致应用程序崩溃,...

    dex-tools-2.1.rar

    然而,有时在处理Dex文件时,开发者可能会遇到“can not merge I and Z”这样的错误,这通常是由于混淆、优化或者不同版本的Dex文件合并时出现的问题。本压缩包“dex-tools-2.1.rar”提供的解决方案是基于dex2jar...

    在Java中异常分析

    - **异常路径**:`java.lang.Object -> java.lang.Throwable -> java.lang.Exception -> java.lang.RuntimeException -> java.lang.IndexOutOfBoundsException -> java.lang.ArrayIndexOutOfBoundsException` ...

Global site tag (gtag.js) - Google Analytics