4

任何人都可以就以下问题提出建议:我正在尝试从 Android 的帮助页面执行代码,但它对我不起作用:

public class DownloadFilesTask extends AsyncTask<String, Integer, Long> {
        protected Long doInBackground(String... urls) {
            Log.e("TuneWiki", "Exec");
            return 1l;
        }

        @Override
        protected void onPostExecute(Long result) {
            Log.e("TuneWiki", "Post");
        }
}

当我执行任务时, doInBackground 被很好地调用,但 onPostExecute 永远不会被调用:(

在具有 2.1 操作系统的 Milestone 上测试

4

2 回答 2

6

谢谢大家-我找到了原因。如果之前启动了很多线程,即使所有线程都已成功完成,AsyncTask 也会因某种原因停止工作。

于 2010-07-30T05:33:08.317 回答
1

使用 AsyncTasks 进行文件下载不是一个好主意(正如 AsyncTask 的名称所暗示的那样)。AsyncTasks 不应该用于网络等长时间运行的操作。事实上 AsyncTask 有两个相关的主要问题:

  • 它们与活动生命周期的联系很差
  • 创建内存泄漏很容易。

RoboSpice Motivations 应用程序(可在 Google Play 上获得)中,我们详细回答了这个问题。它将深入了解 AsyncTasks、Loader、它们的特性和缺点,并向您介绍网络请求的替代解决方案:RoboSpice。

我们甚至提供了一个信息图表来解释这个问题。简而言之

  • AsyncTasks 是有缺陷的,因为它们与活动生命周期的联系很差并且会造成内存泄漏
  • 加载器非常适合它们的设计用途:访问 Sqlite 数据库的游标,但不提供任何网络支持。他们是错误的工具。
  • RoboSpice 在服务中执行网络请求,您的下载在 Android 服务中执行,内存管理良好,甚至还支持编写 REST 请求。

我鼓励您下载RoboSpice Motivations 应用程序,它确实深入地解释了这一点,并提供了执行某些后台操作的不同方法的示例和演示。

于 2012-10-26T06:57:58.867 回答