在我的应用程序中,我有一个继承自AsyncTask
服务器并从服务器下载大量数据的类。我使用 aProgressBar
来指示下载的进度。
当用户HOME
按下键时,它所附加的Activity
那个AsyncTask
被破坏,但是下载继续。
我怎样才能重新附加它AsyncTask
并向用户显示进度?我尝试使用onRetainNonConfigurationInstance
,但 Android 4.0 似乎没有调用此方法。我的应用程序不使用Fragments
API。
在我的应用程序中,我有一个继承自AsyncTask
服务器并从服务器下载大量数据的类。我使用 aProgressBar
来指示下载的进度。
当用户HOME
按下键时,它所附加的Activity
那个AsyncTask
被破坏,但是下载继续。
我怎样才能重新附加它AsyncTask
并向用户显示进度?我尝试使用onRetainNonConfigurationInstance
,但 Android 4.0 似乎没有调用此方法。我的应用程序不使用Fragments
API。
我在这种情况下所做的如下:
这种安排的一个好处是,不需要进度条。事实上,不需要 UI。用户在服务运行时继续使用应用程序,并且 UI 会在新数据进入 ContentProvider 时自动刷新。它的另一个优点是它比 AsyncTask 编写的代码更少。它通过从数据库中读取最后一个条目的服务器端元数据并要求用户在该点之后开始,自动从上次中断的地方开始。由于它不绑定到任何 Activity 实例,它不关心onPostExecute()或配置更改或任何其他。而且您不必担心像 AsyncTask 这样的单次执行。
如果需要在后台下载大量数据,我会使用服务而不是 AsyncTask。Google IO有一个关于使用服务的很好的演示。
引用 AsyncTask 文档:
如果您需要保持线程长时间运行,强烈建议您使用 java.util.concurrent 包提供的各种 API,例如 Executor、ThreadPoolExecutor 和 FutureTask。
和
该任务只能执行一次(如果尝试第二次执行将引发异常。)
据我了解,您无法继续执行上一个 AsyncTask。不过,您可以部分加载数据并保存读取的数据量,然后启动新的 AsyncTask,该任务将从上次保存的点开始。从我的角度来看,当活动进入后台时暂停加载并不是最好的主意,最好使用服务来完成已启动的内容。
您是否考虑过使用服务将 AsyncTask 附加到?将其视为永久运行的服务可能是您手头任务的最佳解决方案。那么您所要做的就是检查服务是否正在运行以及您的下载是否正在运行(使用静态布尔变量很容易完成)然后您只需使用服务中的一些状态保存变量创建一个进度对话框(可能是百分比下载的总文件大小等)在您的主要活动的 onCreate 方法中。