【问题标题】:Android Gingerbread: Can't create handler inside thread that has not called Looper.prepare()Android Gingerbread:无法在未调用 Looper.prepare() 的线程内创建处理程序
【发布时间】:2013-06-12 01:10:21
【问题描述】:

我有这样的代码:

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。 我该如何解决?

【问题讨论】:

标签: java android looper


【解决方案1】:

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

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

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

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

所以在果冻豆中它工作正常。

【讨论】:

  • 首先为什么需要异步任务,因为服务在后台运行?
  • 因为它是连接到互联网的,如果它不使用异步任务不抛出异常吗?
【解决方案2】:

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

【讨论】:

  • 因为在 4.1.2 中这是自动完成的。 AsyncTask 类必须加载到 UI 线程上。这是done automatically,截至JELLY_BEAN。
  • 不知道,见developer.android.com/reference/android/os/AsyncTask.html“线程规则”部分
  • @Trojaner 你能解释一下为什么你想要一个计时器吗?我认为你必须重新考虑你的 appraoxh
  • 代码由服务执行,所以没有UI线程。 @Raghunandan 我该怎么做?
  • @Trojaner 我建议你重新考虑你的设计。服务在后台运行。在服务中,您有一个计时器,并且您在计时器内加载 asynctask。你必须改变你的方法。你需要并行执行吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多