Android Square'sOKhttp。下载进度
使用square's时,有没有办法获得下载文件的进度 我没有找到任何解决办法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
他们有可以异步获取内容的类,但是没有方法来获取当前的进度。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%的速度非常快。