gpt4 book ai didi

android - 下载管理器与 InputStream.read()

转载 作者:行者123 更新时间:2023-11-29 02:42:20 25 4
gpt4 key购买 nike

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

在一般情况下,这两种方法都可以正常工作,但在某些设备上 (例如 xiaomi android 6) DownloadManager 工作速度慢 2-3 倍,或者我得到 DownloadManager .STATUS_FAILED 错误。但为什么? DownloadManager 不稳定吗?还是关于设置?

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

更新 v0.1

1) 我有一个名为 queryStatus() 的处理程序,每 1 秒检查一次。

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

更新 v0.2

尝试从 Service 调用 AsyncTask 下载器(以在用户关闭应用程序而不取消进程的情况下继续下载),UI 更新通过 BroadcastReceiver + sendBreadcase()Service 调用 - 结果:下载速度变慢了好几倍,现在(不时)我得到了一个 流的意外结束异常。 [尝试从 Activity 调用时下载的相同文件]

更新 v0.3

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

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

所以,还是在寻找最稳定的解决方案...

最佳答案

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

关于android - 下载管理器与 InputStream.read(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43249633/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com