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

У меня есть такой код:

final Context context = this;
Timer timer = new Timer();
timer.schedule(new TimerTask()
{
    @Override
    public void run()
    {
        new CheckMessageTask(context).execute(); //ERROR
    }
}, 2500, 10 * 60 * 1000); //Every 10 Minutes

Таймер должен выполнять CheckMessageTask каждые 10 минут. Проблема в том, что эта ошибка появляется:

E/AndroidRuntime: FATAL EXCEPTION: Timer-0
    java.lang.ExceptionInInitializerError
    at -package-CheckMessageService$1.run(CheckMessageService.java:138)
    at java.util.Timer$TimerImpl.run(Timer.java:284)
    Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
    at android.os.Handler.<init>(Handler.java:121)
    at android.os.AsyncTask$InternalHandler.<init>(AsyncTask.java:421)
    at android.os.AsyncTask$InternalHandler.<init>(AsyncTask.java:421)
    at android.os.AsyncTask.<clinit>(AsyncTask.java:152)
    ... 2 more

CheckMessageTask расширяет Asynctask и не запускает код пользовательского интерфейса, так что это не причина. Код прекрасно работает на Android Jelly Bean 4.1.2, но не на Android Gingerbread. Как я могу это исправить?

2 ответа

Решение

Ваша задача таймера выполняется в другом потоке. Вы должны загрузить asynctask в главном потоке пользовательского интерфейса

Проверьте ссылку ниже под темой Threading Rules

http://developer.android.com/reference/android/os/AsyncTask.html

AsyncTask класс должен быть загружен на UI thread, Это делается автоматически с JELLY_BEAN,

Так что в желе-бобе все работает отлично.

Вы не можете выполнить Asynctask не из потока пользовательского интерфейса, что имеет место при использовании таймера

Другие вопросы по тегам