Как разбудить / запустить не запущенное приложение из c2dm listener на Android? - PullRequest
2 голосов
/ 26 мая 2011

У меня возникают проблемы во время тестирования, когда мое приложение не работает в фоновом режиме. Я передаю ему сообщение c2dm, оно получило его, и служба выполняет AsyncTask, чтобы получить некоторые данные с моего сервера, все хорошо, пока не произойдет сбой в onPostExecute с ошибкой MessageQueue:

отправка сообщения обработчику мертвым нить

все работает нормально, когда приложение работает в фоновом режиме, но не работает, когда это не так. я должен как-то разбудить это? спасибо!

ОБНОВЛЕНИЕ: вот фрагмент моей AsyncTask:

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...
    }       
 }

ОБНОВЛЕНИЕ № 2: Ошибка трассировки стека

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)

1 Ответ

1 голос
/ 26 мая 2011

Вы запускаете AsyncTask из приемника вещания? Если это так, вы, скорее всего, захотите переместить AsyncTask в службу и запустить службу с получателя. Вещательные приемники не предназначены для гораздо большего, чем просто ведение бухгалтерского учета или просто для запуска услуги или действия.

РЕДАКТИРОВАТЬ : Также рассмотрите возможность использования очень удобного класса IntentService, который обрабатывает свое намерение в отдельном потоке и останавливает себя, когда это сделано.

...