解决使用Handler时Can't create handler inside thread that has not called Looper.prepare()

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解决使用Handler时Can't create handler inside thread that has not called Looper.prepare()相关的知识,希望对你有一定的参考价值。

    在android开发中,主线程不能进行耗时操作,所以我们经常把耗时操作放在子线程中进行,那么就需要子线程与主线程相互交流,就需要使用到handler.

    而在使用handler过程中,如果对handler使用不太熟练的话就偶尔会出现Can‘t create handler inside thread that has not called Looper.prepare()的报错异常。之前在Handler的原理的博文中有讲到,Handler的使用会依靠Looper循环来发送消息,如果不创建Looper对象,消息就无法发送,系统就会崩溃。那么为什么使用handler有时候可以运行,有时候不能运行呢?

    其实就是如果在主线程中创建handler时,系统会自动创建Looper,但是在子线程中创建handler时,是不会自动创建Looper的,此时如果不手动创建Looper,系统就会崩溃

    举例如下:首先在子线程创建Handler(即主线程发送消息给子线程处理)

    技术分享

技术分享

系统就会报出Can‘t create handler inside thread that has not called Looper.prepare()的报错异常。

解决方法是:

技术分享

通过Looper.prepare();创建Looper对象

    下面在主线程中创建Handler

技术分享

在主线程创建Handler(即子线程发送消息给主线程处理),系统就会自动创建Looper,而不需要手动创建Looper.

本文出自 “11828641” 博客,请务必保留此出处http://11838641.blog.51cto.com/11828641/1842810

以上是关于解决使用Handler时Can't create handler inside thread that has not called Looper.prepare()的主要内容,如果未能解决你的问题,请参考以下文章

Android handler 报错处理Can't create handler inside thread that has not called Looper.prepare()(示例代码

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

Can't get WebApplicationContext object from ContextRegistry.GetContext(): Resource handler for t

在子线程中new Handler报错--Can't create handler inside thread that has not called Looper.prepare()(示例代码

转 在子线程中new Handler报错--Can't create handler inside thread that has not called Looper.prepare()(示例

使用ClipboardManager碰到Can't create handler inside thread that has not called Looper.prepare()(