android - Square 的 OkHttp。下载进度

标签 android android-networking okhttp

使用 square`s OkHttp 时有什么方法可以获取下载文件的进度吗? ?

我在 Recipes 中没有找到任何解决方案.

他们有类(class) Call可以异步获取内容,但是没有办法获取当前进度。

最佳答案

哎呀,答案很明显。对不起愚蠢的问题。只需照常读取 InputStream 即可。

private class AsyncDownloader extends AsyncTask<Void, Long, Boolean> {
    private final String URL = "file_url";

    @Override
    protected Boolean doInBackground(Void... params) {
        OkHttpClient httpClient = new OkHttpClient();
        Call call = httpClient.newCall(new Request.Builder().url(URL).get().build());
        try {
            Response response = call.execute();
            if (response.code() == 200) {
                InputStream inputStream = null;
                try {
                    inputStream = response.body().byteStream();
                    byte[] buff = new byte[1024 * 4];
                    long downloaded = 0;
                    long target = response.body().contentLength();

                    publishProgress(0L, target);
                    while (true) {
                        int readed = inputStream.read(buff);
                        if(readed == -1){
                            break;
                        }
                        //write buff
                        downloaded += readed;
                        publishProgress(downloaded, target);
                        if (isCancelled()) {
                            return false;
                        }
                    }
                    return downloaded == target;
                } catch (IOException ignore) {
                    return false;
                } finally {
                    if (inputStream != null) {
                        inputStream.close();
                    }
                }
            } else {
                return false;
            }
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
    }

    @Override
    protected void onProgressUpdate(Long... values) {
        progressBar.setMax(values[1].intValue());
        progressBar.setProgress(values[0].intValue());

        textViewProgress.setText(String.format("%d / %d", values[0], values[1]));
    }

    @Override
    protected void onPostExecute(Boolean result) {
        textViewStatus.setText(result ? "Downloaded" : "Failed");
    }
}

关于android - Square 的 OkHttp。下载进度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26114299/

相关文章:

安卓搜索: customize suggestion layout

java - 无法使用 Android 数据绑定(bind)进行双重绑定(bind)

android - 启动没有 Activity 的android应用程序

java - 使用网络资源进行货币转换器

Android Retrofit 我有时会得到 ECONNRESET,我不知道为什么

java - 如何解决 JDK 9+ 不支持 java.lang.UnsupportedOperationException : clientBuilder. sslSocketFactory(SSLSocketFactory)?

android - API 17 - Android 通知在不被点击的情况下启动 Activity

android - 如何确定Android中的Wifi,3G,4G(LTE)和VPN是哪个网络接口(interface)?

android - HttpUrlConnection 请求错误(Missing Internet permission when the permission is enabled)

android - OkHttp 和 Retrofit,并发请求刷新 token