如何在 Internet 恢复或重新创建 Activity 时恢复下载

Posted

技术标签:

【中文标题】如何在 Internet 恢复或重新创建 Activity 时恢复下载【英文标题】:How To Resume Download When Internet is Restored or When Activity is Recreated 【发布时间】:2020-11-07 00:03:39 【问题描述】:

我正在使用 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";
    

该代码适用于下载视频文件,但是当下载时断开连接时,可能是由于互联网问题或 onDestroy 活动,我需要一种在互联网恢复或活动重新启动时恢复下载的方法。任何人都可以提供代码 sn-p 或提示我如何实现这一点吗?如果有人能提供帮助,我将不胜感激。

【问题讨论】:

【参考方案1】:

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

【讨论】:

感谢@Vojin P 的洞察力。我想我必须阅读 [Service],因为我对它的用法几乎一无所知。不过有一个问题,使用 [Service] 时我可以下载到私有内部存储吗? 你的意思是下载一些东西并保留它,以便只有你的应用程序可以访问它?这些是存储类型developer.android.com/training/data-storage

以上是关于如何在 Internet 恢复或重新创建 Activity 时恢复下载的主要内容,如果未能解决你的问题,请参考以下文章

“Internet高级重置了找不到高拍仪

如何创建一个倒数计时器,当屏幕关闭时停止并“等待”,重新打开时恢复。安卓

在python中恢复具有不同输入的进程或重新启动它是否更好?

RDD的三个机制

在 warpAffine 转换后如何将点重新映射或恢复到其以前的坐标系?

恢复片段而不重新创建?