恢复Internet或重新创建活动时如何恢复下载

时间:2020-07-17 07:58:54

标签: java android download android-asynctask

我正在使用AsyncTask使用以下代码从URL链接下载视频

 public static class DownloadTask extends AsyncTask<String, Void, String> {
    WeakReference<MainActivity>weakReference;

     DownloadTask(MainActivity activity) {
        weakReference = new WeakReference<>(activity);
    }

    int TIMEOUTTIME = 7000;
    int TSOCKET = 30000;
    String TAG = "TAG";

    @Override
    protected String doInBackground(String... strings) {
        MainActivity subActivity = weakReference.get();
        if (!(activity == null || activity.isFinishing())){
            try {
                URL url = new URL(subActivity.videoUrl);
                long beginTime = System.currentTimeMillis();
                Log.i(TAG, "video download starting at: " + subActivity.videoUrl);

                //Open a connection to that URL.
                URLConnection urlCon = url.openConnection();

                urlCon.setReadTimeout(TIMEOUTTIME);
                urlCon.setConnectTimeout(TSOCKET);

                InputStream is = urlCon.getInputStream();
                BufferedInputStream inStream = new BufferedInputStream(is, 1024 * 5);
                activity.fileTitle = "oneTooMuch TYPE.mp4";
                FileOutputStream outStream  = activity.openFileOutput(activity.fileTitle,MODE_PRIVATE);
              
                byte[] buff = new byte[5 * 1024];

                while ((len = inStream.read(buff)) != -1) {
                    outStream.write(buff, 0, len);
                }

                outStream.flush();
                outStream.close();
                inStream.close();

                Log.i(TAG, "download completed in "
                        + ((System.currentTimeMillis() - startTime) / 1000)
                        + " sec");

            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
        return "Out Condition";
    }

该代码非常适合下载视频文件,但是当下载过程中出现断开连接时,可能是由于Internet问题或活动中断所致,我需要一种方法来在恢复Internet或重新启动活动时恢复下载。谁能提供代码段或有关如何实现此目标的提示?如果有人可以提供帮助,我将非常感谢。

1 个答案:

答案 0 :(得分:0)

更好的解决方案是使用Service代替 AsyncTask 。服务与应用程序分开运行,并且具有更高的优先级。您可以让用户即使在关闭应用程序时也继续下载,并向其提供进度通知,这很方便,因为它可以提供更好的用户体验,例如用户可以在观看已下载的视频的同时下载视频。为此,您需要将移动服务返回到foreground 并从 onStartCommand 返回START_REDILIVER_INTENT。另外,如果您不想使用服务,也可以使用WorkManager进行后台操作