我有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
忘了注意:Activity
因DownloadManager
原因= 1008
也尝试了ION。看起来效果比ERROR_CANNOT_RESUME
好,但有时会出现错误DownloadManager
所以,仍然寻找最稳定的解决方案......
答案 0 :(得分:0)
好的......有很多测试通过了不同的Wi-Fi连接和一组设备。 final File parent = new File("/home/mahmood/project/alpha");
final File tmp = new File(parent, "temp1");
授予最稳定的结果。