Android 在异步任务中运行倒计时

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

我需要以3秒的间隔运行一段代码10次。另外,我想在异步任务上运行它,因为我不希望它与活动绑定。 所以我这样做了: 1.从我的主活动启动了异步任务。 2.我的主要活动是等待异步任务完成。 3.我在AsyncTask中启动了一个倒计时程序,以3秒的间隔执行所需的代码。 4.我必须更新这段代码中的一些UI元素。因此,我在UI线程上运行该部分

问题:在我的倒计时内调用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)
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,它将使我能够运行这段代码,即使活动停止。好的。。我知道你的问题。只需创建一个报警管理器并设置计时器。请参见此处的教程:您有解决方案吗?