繁体   English   中英

Android Gingerbread:无法在未调用Looper.prepare()的线程内创建处理程序

[英]Android Gingerbread: Can't create handler inside thread that has not called 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

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上运行不正常。 我该如何解决?

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

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

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

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

必须在UI thread上加载AsyncTask类。 这是从JELLY_BEAN自动完成的。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM