0

我有这样的代码:

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

Timer 应该每 10 分钟执行一次 CheckMessageTask。问题是出现了这个错误:

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 并且不运行 UI 代码,所以这不是原因。该代码适用于 Android Jelly Bean 4.1.2,但不适用于 Android Gingerbread。我该如何解决?

4

2 回答 2

2

您的计时器任务在不同的线程上运行。您应该在主 ui 线程上加载 asynctask

检查以下主题线程规则下的链接

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

该类AsyncTask必须加载到UI thread. 这是从 开始自动完成的JELLY_BEAN

所以在果冻豆中效果很好。

于 2013-06-11T17:10:21.220 回答
1

您不能从非 UI 线程执行 Asynctask,这是使用 Timer 时的情况

于 2013-06-11T16:57:22.943 回答