我有2个简单的实现DownloadManager
和自定义下载任务:下载管理器VS InputStream.read()
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; } }
i n一般情况下,这两种方法都可以,但是在某些设备上(适用于xiaomi android 6)DownloadManager
工作速度慢了2-3倍,或者我得到了DownloadManager.STATUS_FAILED
错误。但为什么?是DownloadManager
不稳定?或者它对设置有害?
p.s:我想使用DownloadManager
由于定制,我不应该自己执行像设置允许的网络或在通知区域显示进度。
更新V0.1
1)我有处理程序,称为queryStatus()
检查每1秒一次。
2)试图连接到另一个wi-fi
网络与Nexus手机 - DownloadManager
工作正常,但自定义实现失败...
更新V0.2
试图从Service
调用AsyncTask
下载(如果用户在不取消处理的情况下关闭应用程序,则继续下载),通过BroadcastReceiver
更新UI更新+ sendBreadcase()
来自Service
的调用 - 结果:下载速度变慢几倍现在(不时)我得到了一个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
如此,还在寻找最稳定的解决方案......