1

在我的应用程序中,我有一个继承自AsyncTask服务器并从服务器下载大量数据的类。我使用 aProgressBar来指示下载的进度。

当用户HOME按下键时,它所附加的Activity那个AsyncTask被破坏,但是下载继续。

我怎样才能重新附加它AsyncTask并向用户显示进度?我尝试使用onRetainNonConfigurationInstance,但 Android 4.0 似乎没有调用此方法。我的应用程序不使用FragmentsAPI。

4

3 回答 3

4

我在这种情况下所做的如下:

  1. 我创建了一个IntentService来处理与服务器的通信。这具有AsyncTask的一些优点(例如,工作线程),但也具有 Service 的一些优点(随时随地可用)。
  2. IntentService 可以通过我的主 Activity 中的用户操作或通过不精确的重复警报来调用。
  3. 数据存储在一个SQLite 数据库中,前面有一个ContentProvider我通过使用SQLiteOpenHelper并从后台 IntentService 的安全性调用getWritableDatabase()来回避何时/如何创建我的数据库和表的问题。
  4. 任务完成后,如果我的主要活动未激活,它会发布通知。

这种安排的一个好处是,不需要进度条。事实上,不需要 UI。用户在服务运行时继续使用应用程序,并且 UI 会在新数据进入 ContentProvider 时自动刷新。它的另一个优点是它比 AsyncTask 编写的代码更少。它通过从数据库中读取最后一个条目的服务器端元数据并要求用户在该点之后开始,自动从上次中断的地方开始。由于它不绑定到任何 Activity 实例,它不关心onPostExecute()配置更改或任何其他。而且您不必担心像 AsyncTask 这样的单次执行。

于 2012-08-04T20:41:27.133 回答
1

如果需要在后台下载大量数据,我会使用服务而不是 AsyncTask。Google IO有一个关于使用服务的很好的演示

引用 AsyncTask 文档:

如果您需要保持线程长时间运行,强烈建议您使用 java.util.concurrent 包提供的各种 API,例如 Executor、ThreadPoolExecutor 和 FutureTask。

该任务只能执行一次(如果尝试第二次执行将引发异常。)

据我了解,您无法继续执行上一个 AsyncTask。不过,您可以部分加载数据并保存读取的数据量,然后启动新的 AsyncTask,该任务将从上次保存的点开始。从我的角度来看,当活动进入后台时暂停加载并不是最好的主意,最好使用服务来完成已启动的内容。

于 2012-08-04T20:12:42.347 回答
0

您是否考虑过使用服务将 AsyncTask 附加到?将其视为永久运行的服务可能是您手头任务的最佳解决方案。那么您所要做的就是检查服务是否正在运行以及您的下载是否正在运行(使用静态布尔变量很容易完成)然后您只需使用服务中的一些状态保存变量创建一个进度对话框(可能是百分比下载的总文件大小等)在您的主要活动的 onCreate 方法中。

于 2012-08-04T20:14:58.303 回答