Исключение при запуске действия из TimerTask

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

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()

person Mithun Sreedharan    schedule 27.07.2011    source источник


Ответы (4)


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

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

person inazaruk    schedule 27.07.2011

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

person sparkymat    schedule 27.07.2011
comment
Я так считаю. Это просто вопрос замены вызова startActivityForResult в run() вызовом runOnUiThread(startRunnable), а в run() объекта startRunnable вы можете вызвать startActivityForResult. - person sparkymat; 27.07.2011
comment
@Mithun P, вам не стоит использовать TimerTask для опроса в вашем случае, используйте Handler.postDelayed(). Это более надежный и ресурсосберегающий подход для компонента Activity. - person inazaruk; 27.07.2011
comment
@inazaruk Вы имеете в виду «@Mithun P»? - person sparkymat; 27.07.2011

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

person Vincent Mimoun-Prat    schedule 27.07.2011

Стоит посмотреть этот пост:

Невозможно создать обработчик внутри потока, который не называется Looper.prepare ()

Не удается создать обработчик внутри поток, который не вызвал Looper.prepare () внутри AsyncTask для ProgressDialog

Если не решено, не могли бы вы опубликовать свой код там, где вы столкнулись с проблемой !!

person Ash    schedule 27.07.2011