当我全新安装我的应用程序时,我AyncTask
的任何内容似乎都无法运行。无论它是什么,它们都会以“向死线程发送消息”的消息失败。
他们从事各种不同的工作,但他们都失败了。
如果我查看DDMS的线程查看器中的线程,所有5个AsynchTask
线程似乎都处于空闲状态并等待工作。
如果我强制关闭应用程序并重新启动它们,它们都会开始工作。
他们都是在UI线程上开始的。
有什么想法吗?
答案 0 :(得分:3)
这是由于Android框架中的AsyncTask中存在错误。 AsyncTask.java具有以下代码:
private static final InternalHandler sHandler = new InternalHandler();
它期望在主线程上初始化它,但是这不能保证,因为它将在导致类运行其静态初始化器的任何线程上初始化。在您的情况下,您可能会在您创建的工作线程上初始化它。
一个简单的解决方法是将以下代码添加到应用程序的onCreate方法中:
Class.forName("android.os.AsyncTask");
这将强制在主线程中初始化AsyncTask。我在android bug数据库中提交了一个bug。请参阅http://code.google.com/p/android/issues/detail?id=20915。
答案 1 :(得分:1)
好的,所以我想出了这个,但如果有人有进一步的解释,那就太好了。
在应用程序启动时,我有一些我想在后台做的工作 - 一些下载。我启动一个新的HandlerThread并从这个处理程序线程中获取looper并将其发送给我创建的Handler。
在句柄消息中,对于某些操作,当我认为我已经完成(错误或完成)时,我想确保我清理了looper,所以我调用了getLooper()。quit()。事实证明,getLooper()调用正在返回主线程looper。在我退出looper之后,没有任何我的AsynchTask任务,即使它们被传递回主线程Handler响应,因为我已经杀死了looper。
我想下一个问题是为什么getLooper()返回主线程looper。不应该使用HandlerThread中的那个吗?或者就是这样,因为我在UI线程上创建了HandlerThread,它以某种方式绑定到主线程?