2

我想使用 AsyncTask 用服务器更新我的 db4o。在 doInBackground 方法中,我连接到服务器,更新 db4o,并安排一个挂起的意图。不修改 UI 或显示任何 toast。

最初,我有以下错误:

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)
(...)

五 AsyncTask

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

例子:

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

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

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

提前致谢!

4

3 回答 3

0

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

于 2012-10-30T14:01:40.537 回答
0

如果你想使用AsyncTask所以使用它,你不应该将它与Lopper......

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

已经在后台线程上工作,没有理由调用 Lopper,为什么?

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

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

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

于 2012-10-30T14:10:19.503 回答
0

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

于 2012-10-31T09:29:12.683 回答