繁体   English   中英

为什么我的AsyncTask中需要Looper?

[英]Why do I need a Looper in my AsyncTask?

我想使用AsyncTask通过服务器更新db4o。 在doInBackground方法中,我连接到服务器,更新了db4o,并计划了一个未决的意图。 不修改用户界面或显示任何吐司。

最初,我遇到以下错误:

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

添加Looper.prepare()后,效果很好,但仅适用于五个更新(AsyncTask)。 我已经读过这个主题: AsyncTask线程永不死(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()?

提前致谢!

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

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

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

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

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

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

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

在异步任务中,您不能在后台函数中使用循环。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM