Android 在异步任务中运行倒计时
我需要以3秒的间隔运行一段代码10次。另外,我想在异步任务上运行它,因为我不希望它与活动绑定。 所以我这样做了: 1.从我的主活动启动了异步任务。 2.我的主要活动是等待异步任务完成。 3.我在AsyncTask中启动了一个倒计时程序,以3秒的间隔执行所需的代码。 4.我必须更新这段代码中的一些UI元素。因此,我在UI线程上运行该部分 问题:在我的倒计时内调用super(startTime,interval)后,我立即收到以下错误:Android 在异步任务中运行倒计时,android,multithreading,android-asynctask,countdowntimer,Android,Multithreading,Android Asynctask,Countdowntimer,我需要以3秒的间隔运行一段代码10次。另外,我想在异步任务上运行它,因为我不希望它与活动绑定。 所以我这样做了: 1.从我的主活动启动了异步任务。 2.我的主要活动是等待异步任务完成。 3.我在AsyncTask中启动了一个倒计时程序,以3秒的间隔执行所需的代码。 4.我必须更新这段代码中的一些UI元素。因此,我在UI线程上运行该部分 问题:在我的倒计时内调用super(startTime,interval)后,我立即收到以下错误: 10-04 08:10:31.775 28124-28146
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)
10-04 08:10:31.775 28124-28146/?E/AndroidRuntime﹕ 致命异常:异步任务#3
java.lang.RuntimeException:执行doInBackground()时出错
在android.os.AsyncTask$3.done处(AsyncTask.java:304)
位于java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
位于java.util.concurrent.FutureTask.setException(FutureTask.java:222)
位于java.util.concurrent.FutureTask.run(FutureTask.java:242)
在android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
运行(Thread.java:818)
原因:java.lang.RuntimeException:无法在未调用Looper.prepare()的线程内创建处理程序
android.os.Handler.(Handler.java:200)
位于android.os.Handler.(Handler.java:114)
在android.os.CountDownTimer$1。(CountDownTimer.java:114)
在android.os.CountDownTimer.(CountDownTimer.java:114)
错误是不言自明的。。。doInBackground()在后台线程上运行,由于该线程不打算循环,因此未连接到循环器
您很可能根本不想直接实例化处理程序。。。doInBackground()实现返回的任何数据都将传递给在UI线程上运行的onPostExecute()
在出现问题的STACKTRACE之后添加:
看起来您正在尝试从GL渲染线程启动异步任务。。。不要这样做,因为他们也不会使用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();
}
}
如果您在下面的评论中发现一些问题,请告诉我。您应该使用“感谢”来回答。我希望在我的代码中包含异步任务,这样即使应用程序被用户最小化,任务也能继续运行。您的解决方案是否将提供类似的功能?然后在计时器中调用异步任务。创建另一个AsyncTask,然后放入需要每分钟运行的所需代码,然后在计时器中调用它(通过mking其对象并每分钟调用它)它将在主线程上运行。这不会解决我的问题,因为我需要一个AsyncTask,它将使我能够运行这段代码,即使活动停止。好的。。我知道你的问题。只需创建一个报警管理器并设置计时器。请参见此处的教程:您有解决方案吗?