我有一个看起来像是一个非常乏味的任务,重新安排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:无法在未调用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);
}
}
答案 0 :(得分:0)
您正在没有消息循环的线程上创建Handler。正如Looper
文档所说:
默认情况下,线程没有与之关联的消息循环; 创建一个,在运行循环的线程中调用prepare(), 然后循环()让它处理消息,直到循环停止。
解决此问题的一种方法是使用Handler构造函数将Handler实例显式绑定到特定的Looper。最简单的方法是使用主循环器进行应用;你可以通过静态Looper.getMainLooper()
方法得到它。缺点是这会将你的处理程序绑定到UI线程,只要你不对它做太长的操作,它本身就不那么糟糕;否则你的用户界面会变得没有反应。