为什么我的AsyncTask中需要一个Looper?

时间:2012-10-30 13:37:09

标签: java android android-asynctask handler looper

我想使用AsyncTask来更新我的db4o和服务器。在doInBackground方法中,我连接到服务器,更新db4o,并安排pendingintents。不要修改UI或显示任何吐司。

最初,我遇到以下错误:

Can't create handler inside thread that has not called Looper.prepare() 

添加Looper.prepare()后,工作正常,但仅适用于五次更新(AsyncTask)。我已经阅读了这个主题:AsyncTask threads never die (Android),而现在我没有失败。当我抛出第六次更新时,应用程序崩溃了:

FATAL EXCEPTION: AsyncTask #1
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:200)
at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
at java.util.concurrent.FutureTask.setException(FutureTask.java:125)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
at java.lang.Thread.run(Thread.java:1019)
Caused by: java.lang.RuntimeException: Only one Looper may be created per thread
at android.os.Looper.prepare(Looper.java:74)
(...)

five AsyncTask

我在文档中读到了我需要Looper.loop()的信息,但是这个应用程序崩溃了..

示例:

protected Integer doInBackground(Void... params) {
    Looper.prepare();

        update = new Update();
        update.checknewObjects();
        update.deleteOldObjects();
        update.updateObjects();
        Looper.loop();
}

为什么我需要Looper? 为什么应用程序在五次更新后崩溃了? 我在哪里可以安排Looper.loop()?

提前致谢!

3 个答案:

答案 0 :(得分:0)

如果你想安排任务,你应该使用Timer& TimerTask,根据我的理解,我认为它们应该更符合您的需求。 http://developer.android.com/reference/java/util/Timer.html

答案 1 :(得分:0)

如果您想使用AsyncTask,请使用它,不应将其与Lopper混合......

protected Integer doInBackground(Void... params) {}

已经在后台线程上工作,没有理由打电话给Lopper,为了什么?

如果您的应用程序需要进行某种长时间的计算,那么AsyncTask是非常好的工具,因为它提供了处理UI Thread并允许更新UI的方法。因为每个将使用您的应用程序的用户都应该知道该应用程序“正在做某事”(当需要超过2-5秒时)。

它也是通用的,并提供一些好处。

如果您不需要更新UI,请使用例如Handler

答案 2 :(得分:0)

在asynck任务中你不能在后台函数中使用循环。它给出了错误