DownloadManager vs InputStream.read()

时间:2017-04-06 08:22:47

标签: android download android-download-manager ion

我有DownloadManager和自定义下载任务的简单实现:

  • DownloadManager

    public void onCreate(Bundle savedInstanceState) {
     ...
     mDownloadManager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
    }
    
    private void startDownload(String link) 
     Uri uri=Uri.parse(link);
    
     DownloadManager.Request req = new DownloadManager.Request(uri);
    
     req.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI
            | DownloadManager.Request.NETWORK_MOBILE)
            .setAllowedOverRoaming(false)
            .setVisibleInDownloadsUi(false)
            .setTitle(getString(R.string.app_name))
            .setDescription(getString(R.string.waiting_for_downloading))
            .setDestinationInExternalPublicDir(dataPath,fileName);
    
     lastDownload = mDownloadManager.enqueue(req);
    }
    
    private void queryStatus() {
     Cursor c = mDownloadManager.query(new DownloadManager.Query().setFilterById(lastDownload));
    
     if (c == null) return;
    
     switch (c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS))) {
            case DownloadManager.STATUS_FAILED:
                downloadError();
                break;
            case DownloadManager.STATUS_RUNNING:
                ...
                break;
            case DownloadManager.STATUS_SUCCESSFUL:
                ...
                break;
            default: break;
        }
        c.close();
     }
    
  • 自定义下载任务

    new AsyncTask<String, Void, Void>() {
     @Override
      protected Void doInBackground(String... params) {
        try {
          URL url = new URL(params[0]);
          InputStream input = new BufferedInputStream(url.openStream());
          OutputStream output = new FileOutputStream(saveFile);
          byte data[] = new byte[1024];
    
          while ((count = input.read(data)) != -1) {
              output.write(data, 0, count);
          }
          output.flush();
          output.close();
          input.close();
    
        } catch (Exception e) {
             downloadError();
            }
       return null;
      }
    }
    

在一般情况下,两种方法都可以正常工作,但在某些设备上(对于ex xiaomi android 6) DownloadManager的工作速度要慢2-3倍,否则会出现DownloadManager.STATUS_FAILED错误。但为什么? DownloadManager不稳定?或者它是关于设置的?

p.s:我想使用DownloadManager,因为我不应该自己定制,例如设置允许网络或显示通知区域的进度。

更新v0.1

1)我有一个叫做queryStatus()的处理程序每​​1秒检查一次。

2)尝试使用nexus phone连接到另一个wi-fi网络 - DownloadManager正常,但自定义实施失败...

更新v0.2

尝试从AsyncTask 调用Service下载程序(如果用户关闭应用程序而不取消进程,则继续下载),通过BroadcastReceiver + {更新用户界面{1}}来自sendBreadcase()的调用 - 结果:下载速度变慢了几倍,现在(不时)我遇到Service异常。 [尝试从unexpected end of stream]

拨打电话时下载的相同文件

更新v0.3

忘了注意:ActivityDownloadManager原因= 1008

而失败

也尝试了ION。看起来效果比ERROR_CANNOT_RESUME好,但有时会出现错误DownloadManager

所以,仍然寻找最稳定的解决方案......

1 个答案:

答案 0 :(得分:0)

好的......有很多测试通过了不同的Wi-Fi连接和一组设备。 final File parent = new File("/home/mahmood/project/alpha"); final File tmp = new File(parent, "temp1"); 授予最稳定的结果。