Исключение при запуске действия из TimerTask - PullRequest
0 голосов
/ 27 июля 2011

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

public class SplashTask extends TimerTask {
    @Override
    public void run() {
        Log.i(MY_DEBUG_TAG, "Internet is accessible, Running some Spalsh screen Tasks ");
        if(mBoundService.isDataReady()) {
            Log.e(MY_DEBUG_TAG, "Data is ready in service..");
            startActivityForResult(new Intent(SplashDroid.this, FunWithDataActivity.class), 3);
        } else {
            Log.e(MY_DEBUG_TAG, "Data not ready in service..");
        }
        Log.i(MY_DEBUG_TAG, "Spalsh Tasks fnished..");
    }
}

что, когда данные готовы и FunWithDataActivity собирается начать, я получаю следующую ошибку

07-27 14:53:40.614: ERROR/AndroidRuntime(1042): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()

Ответы [ 4 ]

3 голосов
/ 27 июля 2011

startActivityForResult должен вызываться из потока пользовательского интерфейса (который не является потоком, в котором выполняется обработчик). Для этого переместите код startActivityForResult в Runnable и запустите его, используя runOnUiThread внутри run().

1 голос
/ 27 июля 2011

Вы не можете использовать startActivityForResult из потока, не являющегося пользовательским интерфейсом.Вы можете использовать runOnUiThread() или Handler.post().

Кроме того, вы не должны использовать отдельный поток для опроса.Используйте функцию Handler postDelayed() для опроса.Таким образом, вы не потеряете всю ветку для простого опроса.Для примера см .: Повторить задачу с задержкой?

0 голосов
/ 27 июля 2011
0 голосов
/ 27 июля 2011

Попробуйте вместо этого использовать класс CountDownTimer .Вы также можете увидеть этот ответ для примера: TimerTask в Android?

...