用android下载文件的最佳方法是什么?

时间:2014-06-29 20:56:21

标签: android download

我有一个下载活动,可以为我的应用程序下载一些zip文件。 我希望我的活动有这个功能:

  • 能够暂停/恢复下载
  • 通过进度条显示我的活动UI中的​​下载进度(不是 dialogProgress)
  • 显示有下载进度的通知以及用户点击的时间 通知它会打开我的活动,即使应用程序关闭且我的UI在下载期间保持更新

我搜索了很多,看到了很多方法可以用来下载文件(比如使用AsyncTask / Downloadmanager / Groundy ......),但我不知道哪一个有我想要的功能

您认为一起实现此功能的最佳方法是什么?

我不想要您的完整代码,只是一些提示和方法或参考资料,以帮助我实现这些功能并找到最佳方法。

感谢您的时间。

1 个答案:

答案 0 :(得分:0)

如果下载严格依赖于活动,那么从根本上说,您可以使用AsyncTask来实现上述目标。但是,一旦用户取消或退出活动,就需要正确取消AsyncTask。它还提供了进行进步的基本机制。

例如,想象一个简单的异步任务(不是最佳实现),但如下所示

class SearchAsyncTask extends AsyncTask<String, Void, Void> {

        SearchHttpClient searchHttpClient = null;

        public SearchAsyncTask(SearchHttpClient client) {
            searchHttpClient = client;
        }

        @Override
        protected void onProgressUpdate(Void... values) {
            // You can update the progress on dialog here
            super.onProgressUpdate(values);
        }

        @Override
        protected void onCancelled() {
            // Cancel the http downloading here
            super.onCancelled();
        }

        protected Void doInBackground(String... params) {

            try {

                // Perform http operation here  
                // publish progress using method publishProgress(values)
                return null;
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute() {
                 // If not cancelled then do UI work

        }
    }

现在在你的活动的onDestroy方法

@Override
protected void onDestroy() {
    Log.d(TAG, "ResultListActivity onDestory called");
    if (mSearchTask != null && mSearchTask.getStatus() != AsyncTask.Status.FINISHED) {
    // This would not cancel downloading from httpClient 
    //  we have do handle that manually in onCancelled event inside AsyncTask
        mSearchTask.cancel(true); 
        mSearchTask = null;
    }
    super.onDestroy();
}

但是,如果您允许用户甚至独立于活动下载文件(即使用户离开活动也会继续下载),我建议使用可以在后台进行操作的服务。

更新:刚刚注意到Stackoverflow上有一个类似的答案,它更详细地解释了我的想法Download a file with Android, and showing the progress in a ProgressDialog