Android之—下载带进度条(okhttp)
Android之—下载带进度条(okhttp)
一、布局文件添加进度条
<ProgressBar
android:id="@+id/progressbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:max="100"
style="?android:attr/progressBarStyleHorizontal"
android:layout_marginBottom="50dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintBottom_toBottomOf="parent"/>
二、添加下载监听接口DownloadProgressListener.java
注释:根据不同的情况,调用不同的方法
public interface DownloadProgressListener {
// 下载中使用这个方法
void onDownloadProgress(long sumReaded, long content, boolean done);
// 下载结果,如下载中断等
void onDownloadResult(long sumReaded, long content, boolean done);
// 下载失败使用这个方法,如无法联网等
void onFailResponse();
}
三、新建下载工具类DownloadUtil.java
public class DownloadUtil{
/**
* 带进度下载模式:DownloadProgressListener进度监听器
*
* @param url
* @param listener
*/
public static void download(final String url, final DownloadProgressListener listener){
// 设置响应时间
OkHttpClient client=new OkHttpClient.Builder()
.connectTimeout(3, TimeUnit.SECONDS)
.readTimeout(3,TimeUnit.SECONDS)
.build();
Request request=new Request.Builder()
.url(url)
.build();
Call call=client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
listener.onFailResponse();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
File file=FileUtil.generateFile(url);
InputStream is=response.body().byteStream(); //相应体获得inputStream
BufferedInputStream bis=new BufferedInputStream(is);//将inputstream转换成bufferedinputstream
byte[] content = new byte[1024];
int len=0; //每次读取长度
long sumReaded = 0L;
long contentSize=response.body().contentLength(); //下载文件总长度
FileOutputStream fos=new FileOutputStream(file); //创建fileOutputStream
while((len=bis.read(content))!=-1){ //循环获取字节流
fos.write(content,0,len); //写入文件,读取byte[]中的缓存
sumReaded+=len; //获取已下载长度
listener.onDownloadProgress
(sumReaded,contentSize,len==-1); //监听下载进度,是否下载完成
}
listener.onDownloadResult(sumReaded,contentSize,len==-1);
fos.flush();
fos.close();
bis.close();
is.close();
}
});
}
}
四、利用下载工具类就可以下载文件了
注释:就是实现接口,实现接口方法(例如下载时执行onDownloadProgress方法,将下载进度显示在进度条上)
public void download(){
DownloadUtil.download(url_cab, new DownloadProgressListener() {
@Override
public void onDownloadProgress(long sumReaded, long content, boolean done) {
progressBar.setProgress((int)(sumReaded*100/content));
}
@Override
public void onDownloadResult(long sumReaded, long content, boolean done) {
if(done){
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(Activity_QD.this,"下载完成",Toast.LENGTH_SHORT).show();
}
});
nextActivity();
}
else{
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(Activity_QD.this,"下载不完整",Toast.LENGTH_SHORT).show();
}
});
}
}
@Override
public void onFailResponse() {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(Activity_QD.this,"无法联网",Toast.LENGTH_SHORT).show();
}
});
try {
Thread.sleep(1000);
nextActivity();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}