在Android中调用asynctask时出现计时器错误

时间:2013-03-17 07:39:40

标签: java android timer android-asynctask

我在服务中有这个计时器,它完美地工作并计数...但是当我调用一些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”);一切顺利

3 个答案:

答案 0 :(得分:2)

需要从UI线程创建/调用

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);

点击此处阅读有关处理程序和计时器的更多信息:

Timer

AsynchTask

这是一个关于线程的好教程: 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