【发布时间】:2009-08-01 05:03:48
【问题描述】:
我有一个扩展 Activity 的类,我试图在普通的 java 类中创建该类的对象,但它抛出了一个异常:
Can't create handler inside thread that has not called looper.prepare
我做错了什么?
提前致谢。
【问题讨论】:
-
当你懒得发一个详细的问题时,你到底指望别人如何帮助你?
我有一个扩展 Activity 的类,我试图在普通的 java 类中创建该类的对象,但它抛出了一个异常:
Can't create handler inside thread that has not called looper.prepare
我做错了什么?
提前致谢。
【问题讨论】:
您应该阅读 application fundamentals 的 Android 应用程序
我想不出您需要自己创建活动对象的示例。您应该使用 Context.startActivity() 调用来启动活动。
无论如何,回答您的问题 - 活动实现了一个消息队列(使用处理程序),其中可以将消息发送到活动的运行线程以执行某些任务。这意味着执行 Activity 代码的线程会一直等待这些消息(这些消息的一个示例是用户对您的应用程序 UI 的响应)。为此,您需要使用“循环”(或以某种方式等待)消息的 Looper 线程。为您的应用程序呈现 UI 的应用程序的主线程是一个循环线程。
如果由于某种原因您需要手动创建活动对象,那么您应该重新考虑如何设计您的应用程序。只需使用 startActivity。
【讨论】:
处理程序在创建它的任何线程中运行。因此,如果您没有在 UI 线程中创建新类的实例,那么处理程序就不会在 UI 线程中运行,您就会遇到问题。
我曾经尝试在一个 用于性能的单独线程 原因。我没有触摸任何窗口 那一点,但是当我充气时我得到了 同样的错误信息,我刚刚跑了 Looper.prepare() 在我的线程和所有 很好。
Looper 运行线程的消息循环。如果你不打电话 Looper.prepare()(然后 Looper.loop())在一个线程中,那个线程 不会有消息循环,所以不能有接受的 Handler 对象 消息。
【讨论】: