我需要以3秒的间隔运行一段代码10次。另外,我想在AsyncTask上运行它,因为我不希望它与活动绑定。 所以我这样做了: 1.从我的主要活动开始执行异步任务。 我让我的主要活动现在正在等待完成异步任务。 3.我在AsyncTask中启动了一个CountDownTimer,以3秒的间隔执行所需的代码片段。 我必须更新这段代码中的一些UI元素。所以,我在UI线程上运行该部分。
问题:在我的CountDownTimer中调用super(startTime,interval)后,我收到以下错误:
10-04 08:10:31.775 28124-28146/? E/AndroidRuntime﹕ FATAL EXCEPTION: AsyncTask #3
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:304)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
at java.util.concurrent.FutureTask.run(FutureTask.java:242)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:818)
Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
at android.os.Handler.<init>(Handler.java:200)
at android.os.Handler.<init>(Handler.java:114)
at android.os.CountDownTimer$1.<init>(CountDownTimer.java:114)
at android.os.CountDownTimer.<init>(CountDownTimer.java:114)
答案 0 :(得分:0)
错误是不言自明的... doInBackground()在后台线程上运行,因为它不打算循环,所以没有连接到Looper。
你很可能根本不想直接实例化一个Handler ... doInBackground()实现返回的任何数据都将被传递给在UI线程上运行的onPostExecute()。
在问题出现后出现的问题:
看起来你正在尝试从GL渲染线程启动AsyncTask ...不要这样做,因为它们也不会是Looper.loop()。 AsyncTasks实际上只能从UI线程运行。
所以我建议你制作一个需要每分钟运行一次所需代码的方法,然后用计时器设置它。
例如:
private TimerTask mTimerTask;
private Timer t = new Timer();
public void doTimerTask() {
mTimerTask = new TimerTask() {
public void run() {
handler.post(new Runnable() {
public void run() {
callYourMethodHere();
Log.i("TIMER", "TimerTask run");
}
});
}
};
// public void schedule (TimerTask task, long delay, long period)
t.schedule(mTimerTask, 500, 1000); //
}
public void stopTask() {
if (mTimerTask != null) {
Log.i("TIMER", "timer canceled");
mTimerTask.cancel();
}
}
如果您通过以下评论发现问题,请告诉我。