Android Square'sOKhttp。下载进度

Android Square'sOKhttp。下载进度,android,android-networking,okhttp,Android,Android Networking,Okhttp,使用square's时,有没有办法获得下载文件的进度 我没有找到任何解决办法 他们有可以异步获取内容的类,但是没有方法来获取当前的进度。Oops的答案是显而易见的。对不起,这个愚蠢的问题。只需要像往常一样读取InputStream private class AsyncDownloader extends AsyncTask<Void, Long, Boolean> { private final String URL = "file_url"; @Override

使用square's时,有没有办法获得下载文件的进度

我没有找到任何解决办法


他们有可以异步获取内容的类,但是没有方法来获取当前的进度。

Oops的答案是显而易见的。对不起,这个愚蠢的问题。只需要像往常一样读取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");
    }
}
私有类AsyncDownloader扩展了AsyncTask{
私有最终字符串URL=“文件\ URL”;
@凌驾
受保护的布尔doInBackground(Void…params){
OkHttpClient httpClient=新的OkHttpClient();
Call Call=httpClient.newCall(newrequest.Builder().url(url.get().build());
试一试{
Response=call.execute();
if(response.code()==200){
InputStream InputStream=null;
试一试{
inputStream=response.body().ByTestStream();
字节[]buff=新字节[1024*4];
长下载=0;
长目标=response.body().contentLength();
出版进度(0升,目标);
while(true){
int readed=inputStream.read(buff);
如果(读取==-1){
打破
}
//写入缓冲区
下载+=已阅读;
出版进度(下载,目标);
如果(isCancelled()){
返回false;
}
}
返回下载==目标;
}捕获(IOException忽略){
返回false;
}最后{
如果(inputStream!=null){
inputStream.close();
}
}
}否则{
返回false;
}
}捕获(IOE异常){
e、 printStackTrace();
返回false;
}
}
@凌驾
受保护的void onProgressUpdate(长…值){
progressBar.setMax(值[1].intValue());
progressBar.setProgress(值[0].intValue());
textViewProgress.setText(String.format(“%d/%d”,值[0],值[1]);
}
@凌驾
受保护的void onPostExecute(布尔结果){
textViewStatus.setText(结果?“已下载”:“失败”);
}
}

每次在while循环中,您都会发布进度。因此,这就像被阻止一样

您可以使用okHttp receipe:

是否有更优雅的方法来执行此操作?像okHttpClient.newCall(请求).notifyProgress(回调)。。。或者类似的…很好的答案,但还有一个问题。。。我看到我们有一个输入流。。。要将其传递到文件,我们必须再次循环整个流并将其转换为文件吗?你能告诉我你是如何得到已经下载的文件对象的吗?@MarcusGabilheri你是说这个吗@卡利亚加诺夫·阿列克谢:是的。我昨天就知道了。对不起,这是个愚蠢的问题:(.我的问题是,我在加载文件后试图使用输入流。这个答案通常是错误的,因为它显示了从响应输入流复制字节的进度,而响应输入流只有在文件完全下载时才可用。因此,如果你有一个10兆字节的文件,网络速度为1MB/s,你会在10秒和10秒内看到0%母鸡从0%到100%的速度非常快。