1.OkHttp下载文件
public static void okDownload(String url, final String path){
String savaFile = "/storage/emulated/0/a.apk";
OkHttpClient okHttpClient = new OkHttpClient();
Request request = new Request.Builder()
.url(url)
.get()
.build();
//异步调用,不用再新建线程了
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
//第一个0表示失败,第二个0表示进度,第三个0表示最大进度,失败都为0
EventBus.getDefault().post(new MsgE(0,0,0));
}
@Override
public void onResponse(Call call, Response response) throws IOException {
InputStream inputStream = response.body().byteStream();
long max = response.body().contentLength();//得到文件的大小
savaFile(savaFile,inputStream,max);//保存文件到本地
}
});
}
2.Retrofit下载
new Retrofit.Builder()
.baseUrl(ApiService.url_load)
.build()
.create(ApiService.class)
.getLoad()
.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
final long max = response.body().contentLength();
final InputStream in = response.body().byteStream();
new Thread() {
@Override
public void run() {
super.run();
saveFile(file, max, in);
}
}.start();
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
}
});
3.HttpUrlConnection下载
public class ThreadManager {
private static ThreadManager mManager;
private final ThreadPoolExecutor mExecutor;
private ThreadManager(){
mExecutor = new ThreadPoolExecutor(5,//核心线程数量,核心池的大小
20,//线程池最大线程数
30,//表示线程没有任务执行时最多保持多久时间会终止
TimeUnit.SECONDS,//时间单位
new LinkedBlockingQueue<Runnable>(),//任务队列,用来存储等待执行的任务
Executors.defaultThreadFactory(),//线程工厂,如何去创建线程的
new ThreadPoolExecutor.AbortPolicy());
}
public static ThreadManager getInstance(){
if (mManager == null){
synchronized (ThreadManager.class){
if (mManager == null){
mManager = new ThreadManager();
}
}
}
return mManager;
}
/**
* 执行任务
*/
public void execute(Runnable runnable){
if(runnable==null) return;
mExecutor.execute(runnable);
}
/**
* 从线程池中移除任务
*/
public void remove(Runnable runnable){
if(runnable==null)return;
mExecutor.remove(runnable);
}
}
public static void httpDownload(final String url, final String path, final ResultCallBack callBack) {
ThreadManager.getInstance().execute(new Runnable() {
@Override
public void run() {
//由线程池提供线程
try {
String savaFile = new File("/storage/emulated/0/c.apk");
URL url1 = new URL(url);
HttpURLConnection conn = (HttpURLConnection) url1.openConnection();
int responseCode = conn.getResponseCode();
if (responseCode == 200){
InputStream inputStream = conn.getInputStream();
int max = conn.getContentLength();
savaFile(savaFile,inputStream,max);
}
} catch (Exception e) {
e.printStackTrace();
callBack.onFail(e.getMessage());
}
}
});
}
4.saveFile
private void saveFile(File file, long max, InputStream in) {
EventBus.getDefault().post(new ProgressEvent(1, 0,(int) max, 0));
try {
FileOutputStream out = new FileOutputStream(file);
int len = 0;
int count = 0;
byte[] bytes = new byte[1024 * 4];
while ((len = in.read(bytes)) != -1) {
out.write(bytes, 0, len);
count += len;
int l = (int) ((float) (count / max) * 100);
EventBus.getDefault().post(new ProgressEvent(2, count,(int) max, l));
}
out.close();
in.close();
} catch (Exception e) {
e.printStackTrace();
}
}
网友评论