我在服务中有这个计时器,它完美地工作并计数...但是当我调用一些asyntask时它会给我错误!!
Timer time = new Timer(); // Instantiate Timer Object
time.schedule(new TimerTask(){
public void run() {
// i call my Asyntasks here
}
},5000,5000);
这给了我错误:
03-17 02:02:27.167: E/AndroidRuntime(925): FATAL EXCEPTION: Timer-0
03-17 02:02:27.167: E/AndroidRuntime(925): java.lang.ExceptionInInitializerError
03-17 02:02:27.167: E/AndroidRuntime(925): at Dic.proj.pkg.notifService$1.run(notifService.java:57)
03-17 02:02:27.167: E/AndroidRuntime(925): at java.util.Timer$TimerImpl.run(Timer.java:289)
03-17 02:02:27.167: E/AndroidRuntime(925): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
03-17 02:02:27.167: E/AndroidRuntime(925): at android.os.Handler.<init>(Handler.java:121)
03-17 02:02:27.167: E/AndroidRuntime(925): at android.os.AsyncTask$InternalHandler.<init>(AsyncTask.java:421)
03-17 02:02:27.167: E/AndroidRuntime(925): at android.os.AsyncTask$InternalHandler.<init>(AsyncTask.java:421)
03-17 02:02:27.167: E/AndroidRuntime(925): at android.os.AsyncTask.<clinit>(AsyncTask.java:152)
03-17 02:02:27.167: E/AndroidRuntime(925): ... 2 more
如果我把其他指令如Log.d(“message”);一切顺利
答案 0 :(得分:2)
AsynchTask ,或者当任务想要向调用者线程发布任何内容(例如onPostExcute()
)时,至少需要一个带有looper的线程来处理回调...并且使用在其自己的线程中运行的 Timer 对象不满足此条件。
我建议您使用处理程序与计时器结合使用,或者甚至使用处理程序对象创建自己的计时器。
第一个想法看起来像这样:
final Handler handler = new Handler();
Timer time = new Timer(); // Instantiate Timer Object
time.schedule(new TimerTask(){
public void run() {
handler.post(new Runnable(){
// i call my Asyntasks here
});
}
},5000,5000);
点击此处阅读有关处理程序和计时器的更多信息:
这是一个关于线程的好教程: Tutorials
答案 1 :(得分:1)
看来,你应该在UI线程内部启动AsyncTasks。
您可以尝试使用Handler.postDelayed(Runnale, long)代替计时器。
答案 2 :(得分:1)
必须在UI线程上加载AsyncTask类。这是从JELLY_BEAN开始自动完成的。
必须在UI线程上创建任务实例。
您正在创建新主题。使用处理程序。在主线程上运行
private Handler handler = new Handler();
Runnable task = new Runnable() {
@Override
public void run() {
//do something
handler.postDelayed(this, 100000);
}
};
handler.removeCallbacks(task);
handler.post(task);
http://developer.android.com/reference/android/os/AsyncTask.html