繁体   English   中英

DownloadManager与InputStream.read()

[英]DownloadManager vs InputStream.read()

我有2个简单的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; } } 

在一般情况下,两种方法都可以,但是在某些设备上(例如适用于小米android 6), DownloadManager运行速度要慢2-3倍,或者出现DownloadManager.STATUS_FAILED错误。 但为什么? DownloadManager不稳定吗? 还是关于设置的秘密?

ps:我想使用DownloadManager因为我不应该自己执行自定义,例如设置允许的网络或在通知区域显示进度。

更新v0.1

1)我有调用queryStatus()处理程序,每1秒检查一次。

2)尝试连接到其他wi-fi网络的Nexus手机- DownloadManager工作正常,但自定义实现失败...

更新v0.2

尝试从Service调用AsyncTask下载器(以在用户关闭应用而未取消进程的情况下继续下载) ,通过Service BroadcastReceiver + sendBreadcase() UI更新-结果:下载变得慢了几倍,而现在(时不时) unexpected end of stream异常异常unexpected end of stream [尝试从Activity拨打电话时下载的相同文件]

更新v0.3

忘了注意: DownloadManager失败,原因为1008原因= ERROR_CANNOT_RESUME

也尝试过ION 看起来是否比DownloadManager更好,但有时会出现错误End of data reached before content length was read: 70385664/77217546

因此,仍在寻找最稳定的解决方案...

好的...通过不同的Wi-Fi连接和设备集通过了许多测试。 ION提供最稳定的结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM