【问题标题】:Android Dev: reschedule Timer and TimerTaskAndroid Dev:重新安排 Timer 和 TimerTask
【发布时间】:2012-03-05 04:07:47
【问题描述】:

我有这似乎是一项非常繁琐的任务,即重新安排 Timer 和 TimerTask 以使我的服务/正在进行的进程能够在不同时间执行...我尝试搜索许多论坛,包括 this example,这似乎已经奏效对于这个人,但是当我在我的服务中尝试相同的代码时,我收到以下错误:

03-04 14:21:41.204:E/AndroidRuntime(336):致命异常:Timer-0

03-04 14:21:41.204: E/AndroidRuntime(336): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()

有谁知道这个错误是什么意思,有什么可能的解决方案?根据我在网上研究的有关此错误的信息:它通常发生在我尝试在非 UI 线程上进行 UI 更改时...在我的情况下,我所做的只是发送通知,然后调用 reScheduleTimer 函数,如该示例中...

任何意见表示赞赏...

编辑: 这是它爆炸的代码:

    public void reScheduleTimer(long duration) {
    Log.v(TAG, "Inside reScheduleTimer");
    timer.cancel();
    timer = new Timer("profileSwitcherTimer", true); 
    timerTask = new MyTimerTask(); <----
    timer.schedule(timerTask, duration);
}

这是 MyTimerTask 类:

public class MyTimerTask extends TimerTask{
private Handler updateUI = new Handler(){
        public void dispatchMessage(Message msg) {
            Toast.makeText(getApplicationContext(), "Timer Ran", Toast.LENGTH_LONG).show();
        }
}

public void run() {
    ....code that i want execute
    showNotification();
    reScheduleTimer(60000);
}

}

【问题讨论】:

  • 你能贴出抛出异常的代码块吗?如果我们能看到您已经写的内容会更有帮助。
  • @Robert:使用我正在使用的代码的 sn-ps 编辑原始帖子...

标签: android timer


【解决方案1】:

您正在一个没有消息循环的线程上创建处理程序。正如Looper 文档所说:

默认情况下,线程没有与之关联的消息循环; 要创建一个,请在要运行循环的线程中调用 prepare(), 然后 loop() 让它处理消息,直到循环停止。

解决此问题的一种方法是通过使用接受一个的 Handler 构造函数将您的 Handler 实例显式绑定到特定的 Looper。最简单的方法是只为应用程序使用主循环器;你可以通过静态Looper.getMainLooper() 方法得到它。缺点是这会将您的处理程序绑定到 UI 线程,这本身并没有那么糟糕,只要您不对它执行太长的操作即可;否则您的 UI 将变得无响应。

【讨论】:

  • omg...我简直不敢相信...我一定花了很多时间试图理解为什么这突然开始爆炸...在处理程序中,我所做的只是输出 Toast 消息……我不明白的是,即使我不调用 updateUI,它是如何爆炸的……
  • TimerTask 实例的构造函数隐式调用updateUI 处理程序的构造函数,这会导致崩溃。
猜你喜欢
  • 1970-01-01
  • 2011-09-22
  • 1970-01-01
  • 2011-01-10
  • 1970-01-01
  • 2012-06-23
  • 2013-03-04
  • 2011-09-01
  • 1970-01-01
相关资源
最近更新 更多