0

我在服务中有这个计时器,它运行良好并且计数......但是当我调用一些 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"); 一切顺利

4

3 回答 3

2

AsynchTask需要从 UI 线程或至少一个带有 looper 的线程创建/调用,以在任务想要向调用者线程发布任何内容时处理回调,例如onPostExcute()......并且使用在其自己的线程中运行的Timer对象不t 满足这个条件。

我建议您使用Handler结合Timer来实现这一点,甚至可以使用 handler 对象创建自己的计时器。

第一个想法看起来像这样:

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

查看此处以了解有关处理程序和计时器的更多信息:

定时器

异步任务

这是一个关于线程的好教程: 教程

于 2013-03-17T07:52:33.020 回答
1

看来,您应该在 UI 线程内启动 AsyncTasks。

您可以尝试使用Handler.postDelayed(Runnale, long)而不是 Timer。

于 2013-03-17T07:45:47.647 回答
1

AsyncTask 类必须在 UI 线程上加载。这是从 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

于 2013-03-17T07:54:37.080 回答