我有一个AsyncTask
,它提取一些数据,然后用这个新数据更新UI。几个月来一直工作正常,但我最近添加了一项功能,可以在有新数据时显示通知。现在,当我的应用程序通过通知启动时,有时候我会得到此异常,并且不会调用onPostExecute
。onPostExecute未在AsyncTask中调用(处理程序运行时异常)
这是当应用启动会发生什么:
1)展开UI,发现意见
2)取消报警(通过AlarmManager
)来检查新数据和解除报警。 (这样,如果用户禁用该警报,则在他/她下次重新启动之前取消该警报。)
3)启动AsyncTask
。如果应用程序是从通知启动的,请传入一点数据,然后取消通知。
我被困在什么可能会导致此异常。看起来这个例外是来自AsyncTask
的代码,所以我不知道如何解决它。
谢谢!
这里是个例外:
I/My App( 501): doInBackground exiting
W/MessageQueue( 501): Handler{442ba140} sending message to a Handler on a dead thread
W/MessageQueue( 501): java.lang.RuntimeException: Handler{442ba140} sending message to a Handler on a dead thread
W/MessageQueue( 501): at android.os.MessageQueue.enqueueMessage(MessageQueue.java:179)
W/MessageQueue( 501): at android.os.Handler.sendMessageAtTime(Handler.java:457)
W/MessageQueue( 501): at android.os.Handler.sendMessageDelayed(Handler.java:430)
W/MessageQueue( 501): at android.os.Handler.sendMessage(Handler.java:367)
W/MessageQueue( 501): at android.os.Message.sendToTarget(Message.java:348)
W/MessageQueue( 501): at android.os.AsyncTask$3.done(AsyncTask.java:214)
W/MessageQueue( 501): at java.util.concurrent.FutureTask$Sync.innerSet(FutureTask.java:252)
W/MessageQueue( 501): at java.util.concurrent.FutureTask.set(FutureTask.java:112)
W/MessageQueue( 501): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:310)
W/MessageQueue( 501): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
W/MessageQueue( 501): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
W/MessageQueue( 501): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
W/MessageQueue( 501): at java.lang.Thread.run(Thread.java:1096)
编辑:这是我在我的主要活动(一经通知开)onCreate
方法。我省略了一些onClickListeners
以节省空间。我不认为它们应该有任何效果,因为它们所连接的按钮没有被按下。编辑2:我一直在挖掘Android源代码追踪异常来自哪里。这是行456和Handler
的sendMessageAtTime
457:
msg.target = this;
sent = queue.enqueueMessage(msg, uptimeMillis);
这是enqueueMessage
从MessageQueue
:
final boolean enqueueMessage(Message msg, long when) {
if (msg.when != 0) {
throw new AndroidRuntimeException(msg
+ " This message is already in use.");
}
if (msg.target == null && !mQuitAllowed) {
throw new RuntimeException("Main thread not allowed to quit");
}
synchronized (this) {
if (mQuiting) {
RuntimeException e = new RuntimeException(
msg.target + " sending message to a Handler on a dead thread");
Log.w("MessageQueue", e.getMessage(), e);
return false;
} else if (msg.target == null) {
mQuiting = true;
}
msg.when = when;
//Log.d("MessageQueue", "Enqueing: " + msg);
Message p = mMessages;
if (p == null || when == 0 || when < p.when) {
msg.next = p;
mMessages = msg;
this.notify();
} else {
Message prev = null;
while (p != null && p.when <= when) {
prev = p;
p = p.next;
}
msg.next = prev.next;
prev.next = msg;
this.notify();
}
}
return true;
}
我有点无所适从mQuiting
是,但它看起来像以前的时间enqueueMessage
被称为msg.target
为空。
创建您的AsyncTask线程必须已经退出。你如何创建你的AsyncTask? – 2010-11-25 19:50:26
我用代码更新了我的问题。当我仍然可以看到加载屏幕时,我看不到Activity如何退出。 – Computerish 2010-11-30 21:45:35
我们需要看到更多的代码。 – Falmarri 2010-11-30 22:00:39