如何在Android上从c2dm listener唤醒/启动不运行应用程序?
当我的应用程序未在后台运行时,我在测试过程中遇到问题。我向它广播c2dm消息,它确实收到了,我服务执行异步任务从我的服务器获取一些数据,一切正常,直到它在“onPostExecute”上失败并出现MessageQueue错误: 将消息发送到死机上的处理程序 线 当应用程序在后台运行时,一切正常,但当应用程序不在后台运行时,一切都会失败。我一定要把它弄醒吗?谢谢 更新:以下是我的异步任务的片段:如何在Android上从c2dm listener唤醒/启动不运行应用程序?,android,android-asynctask,android-c2dm,Android,Android Asynctask,Android C2dm,当我的应用程序未在后台运行时,我在测试过程中遇到问题。我向它广播c2dm消息,它确实收到了,我服务执行异步任务从我的服务器获取一些数据,一切正常,直到它在“onPostExecute”上失败并出现MessageQueue错误: 将消息发送到死机上的处理程序 线 当应用程序在后台运行时,一切正常,但当应用程序不在后台运行时,一切都会失败。我一定要把它弄醒吗?谢谢 更新:以下是我的异步任务的片段: private class getNewMessages extends AsyncTask<V
private class getNewMessages extends AsyncTask<Void, Void, Boolean> {
private Context gContext;
private String gToken;
private int gNewMessages;
public getNewMessages(Context context, String token) {
super();
gContext = context;
gToken = token;
}
protected Boolean doInBackground(Void... args) {
gNewMessages = data.serverNewMessagesGet(gContext, gToken);
return true;
}
protected void onPostExecute(Boolean result) {
Log.d(common.DEBUG_TAG, "retrieved " + gNewMessages + " new messages");
// notify user, etc...
}
}
您是否在广播接收器内启动
AsyncTask
?如果是这样,您可能希望将AsyncTask
移动到一个服务,并从接收方启动该服务。广播接收器的用途不仅仅是基本的簿记,或者只是开始一项服务或活动
<强>编辑< /强>:也考虑使用非常方便的类,它在一个单独的线程中处理它的意图并在完成时停止它自己。
我正在运行从服务中的ASycTask,我的接收器启动服务。你能用AsyncTask的代码片段更新你的问题吗?如果有异常,你能发布堆栈跟踪吗?@Roman Nurik:包括堆栈跟踪。我刚刚读到一篇文章说AsyncTask应该只从UI线程使用。不知道这是否正确。是的,onPostExecute
在调用线程上被调用,该线程必须是活动的,并且必须有一个循环器
。。。我不确定是否必须从UI线程调用AsyncTask
,但这是有意义的。如果您是从IntentService
运行此代码,则说明您已经处于非UI线程中。我已删除了AsyncTask,并且在应用程序未运行时它可以正常工作。不知道我是否真的需要这个服务。。。我只是不希望应用程序在获取数据时冻结。会吗?当它从服务内部执行时?您可以只生成一个单独的线程而不使用AsyncTask。IntentService为您生成一个线程;普通的服务在主线程中运行,所以要小心。
Handler{4585c038} sending message to a Handler on a dead thread
java.lang.RuntimeException: Handler{4585c038} sending message to a Handler on a dead thread
at android.os.MessageQueue.enqueueMessage(MessageQueue.java:184)
at android.os.Handler.sendMessageAtTime(Handler.java:457)
at android.os.Handler.sendMessageDelayed(Handler.java:430)
at android.os.Handler.sendMessage(Handler.java:367)
at android.os.Message.sendToTarget(Message.java:348)
at android.os.AsyncTask$3.done(AsyncTask.java:214)
at java.util.concurrent.FutureTask$Sync.innerSet(FutureTask.java:252)
at java.util.concurrent.FutureTask.set(FutureTask.java:112)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:310)
at java.util.concurrent.FutureTask.run(FutureTask.java:137)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
at java.lang.Thread.run(Thread.java:1096)