文档章节

java.lang.RuntimeException: Can't create handler

今日竹石
 今日竹石
发布于 2014/03/15 14:07
字数 464
阅读 415
收藏 0

调用 handler 使用报错java.lang.RuntimeException: Can't create handler inside thread that has not called Looper


在你的类中加

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();StrictMode.setThreadPolicy(policy);

和在你的ManiFestFile中加:

<uses-permission android:name="android.permission.INTERNET"/>


调用Looper.prepare()启用Looper后执行


介绍:

Toast和Looper。Handler消息循环机制。


(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) 基于以上知识,可实现主线程给子线程(非主线程)发送消息。


© 著作权归作者所有

共有 人打赏支持
今日竹石
粉丝 41
博文 227
码字总数 181312
作品 0
朝阳
程序员
私信 提问
Unity-Android: Can't create handler inside thread

Unity-Android: Can't create handler inside thread that has not called Looper.prepare() [+] 在做unity-android的过程中,遇到这个错误: java.lang.RuntimeException: Can't create han......

班帅
2014/03/24
0
0
不同的手机上运行效果不一样,怎么办

我有一段代码在一个新线程中,调用一个异步 OtherFileUploadTask task = new OtherFileUploadTask(this,FamilyConstant.IMG_UPLOAD_URL,"0"); 现在测试结果,在vivo手机上,会报下面的错误,...

天王盖地虎626
2015/04/02
407
4
Frida hook带handler的method

有些Class里面有Handler对象,就必须在 主线程里执行,否则报错 E/AndroidRuntime( 2434): java.lang.ExceptionInInitializerError E/AndroidRuntime( 2434): at dalvik.system.NativeStart......

程序员诗人
2017/05/09
0
0
创建Handler对象必须先初始化一个Looper

创建Handler对象必须先初始化一个Looper , 否则会出现如下错误: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() Activity在被创建......

AlexZhuang
2012/04/11
0
0
Android ExceptionInInitializerError解决办法

错误代码(old_code) new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(1000 * 8); } catch (InterruptedException e) { // TODO Auto-generated catch bloc......

深圳_小白菜
2014/04/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

大数据剖析热点新闻:996、巴黎圣母院、奔驰维权为什么成为本周热搜

智能大数据专家表示:每一段重要的时期都会有一串隐秘的数字密码,请往下看: 本周共有50条新闻,作为嗅嗅的样本进行数据分析,得出以下统计图: 1.新闻热词折线统计图 在新闻标题及正文中,...

forespider
22分钟前
0
0
Coding and Paper Letter(六十四)

资源整理。 1 Coding: 1.交互式瓦片编辑器。 tile playground 2.R语言包autokeras,autokeras的R接口。autokeras是一个开源的自动机器学习的软件。 autokeras 3.斯坦福网络分析平台,用于网络...

胖胖雕
59分钟前
1
0
最简单的cd命令是个大坑!

BASH Shell 是大多 Linux 发行版的默认 shell,BASH 有一些自己的内置命令,cd 就是其中的一个。 在centos6里面,系统中不存在 cd 的二进制文件。但是你仍然可以运行该命令,这是因为 cd 是 ...

gaolongquan
今天
1
0
spring获取bean的几种方式

使用jdk:1.8、maven:3.3.3 spring获取Bean的方式 pom.xml文件内容: <?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="......

Vincent-Duan
今天
3
0
一段话系列-Linux中IO的同步、异步、阻塞、非阻塞

首先我们框定一下背景,我们探讨的是Linux系统下的IO模型。 同步和异步是针对内核操作数据而言的,同步是指内核串行顺序操作数据,异步是指内核并行(或并发)操作数据,然后通过回调的方式通...

EasyProgramming
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部