背景
需要实现下载壁纸到手机应用里,面向“百度”编程,通过查找知道可以使用okhttp、glide或者HttpURLConnection下载图片。又发现glide下载图片很快(后面发现是因为下载的同一张图片,glide有缓存,所以很快)。于是就写了程序想对3种下载方式快慢进行比较并记录.
准备
界面有4个按钮,其中3个对应三种下载方式,最后1个按钮删除已经下载过的文件。
思路
在子线程中运行,并下载图片,将其保存在data/data下。
代码
按钮点击事件
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.okhttpButton:
new Thread(() -> {
long startTime = System.currentTimeMillis(); //获取开始时间
try {
Bitmap bitmap = downloadByOkhttp(url);
onSaveBitmap(bitmap,this,"img_1.jpeg");
} catch (IOException e) {
e.printStackTrace();
}
long endTime = System.currentTimeMillis(); //获取结束时间
Log.d(TAG, "okhttp 下载时间:" + (endTime - startTime) + "ms");
}).start();
break;
case R.id.glideButton:
new Thread(()->{
long startTime = System.currentTimeMillis(); //获取开始时间
try {
Bitmap bitmap =Glide.with(this)
.asBitmap()
.load(url)
.submit()
.get();
onSaveBitmap(bitmap,this,"img_2.jpeg");
} catch (ExecutionException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
long endTime = System.currentTimeMillis(); //获取结束时间
Log.d(TAG, "glide 下载时间:" + (endTime - startTime) + "ms");
}).start();
break;
case R.id.httpGetButton:
new Thread(()->{
long startTime = System.currentTimeMillis(); //获取开始时间
Bitmap bitmap = downloadByHttp(url);
onSaveBitmap(bitmap,this,"img_3.jpeg");
long endTime = System.currentTimeMillis(); //获取结束时间
Log.d(TAG, "httpGet 下载时间:" + (endTime - startTime) + "ms");
}).start();
break;
case R.id.deleteBtn:
File file_file = new File("/data/data/com.example.myapplication/files");
deleteFolder(file_file);
break;
default:
break;
}
}
删除图片
public void deleteFolder(File file) {
if (!file.exists())
return;
if (file.isDirectory()) {
File files[] = file.listFiles();
for (int i = 0; i < files.length; i++) {
deleteFolder(files[i]);
}
}
file.delete();
}
HttpURLConnection下载
private Bitmap downloadByHttp(String url) {
try {
URL httpUrl = new URL(url);
HttpURLConnection conn = (HttpURLConnection) httpUrl
.openConnection();
conn.setReadTimeout(5000);
conn.setRequestMethod("GET");
conn.setDoInput(true);
InputStream is = conn.getInputStream();
//转化为bitmap
Bitmap bitmap = BitmapFactory.decodeStream(is);
is.close();
return bitmap;
} catch (IOException e) {
}
return null;
}
okhttp下载
private Bitmap downloadByOkhttp(String url) throws IOException {
OkHttpClient client = new OkHttpClient();
//获取请求对象
Request request = new Request.Builder().url(url).build();
//获取响应体
ResponseBody body = client.newCall(request).execute().body();
//获取流
InputStream is = body.byteStream();
//转化为bitmap
Bitmap bitmap = BitmapFactory.decodeStream(is);
is.close();
return bitmap;
}
保存图片
private void onSaveBitmap(final Bitmap mBitmap, final Context context,String path) {
try {
FileOutputStream fos = context.openFileOutput(path,MODE_PRIVATE);
mBitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
fos.flush();
fos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
结果:
1.
2.
3.
4.
5.
6.
分析总结
由于这3种下载方式在同一个程序里。程序每次请求url所需时间会受到请求顺序的影响,因此按全排列顺序,共进行6次测试。另外由于本人能力不足,测试的下载链接只有同一个下载链接,又因为glide下载一个链接的图片后,会有缓存,第二次用glide下载,速度非常快(只需几十ms),因此为了解决这个问题,我每测试一次都会clean project并卸载手机里的APP
从测试结果来看,6次测试中,1、3、4 HttpURLConnection最快,2、6 glide最快,5 okhttp最快。
HttpURLConnection比glide快4次,比okhttp快5次。
最后个人觉得Android原生自带的HttpURLConnection下载最快。其他两个源码实现有应该调用了HttpURLConnection实现了下载。这个测试只是下载单个图片,相对原生的HttpURLConnection下载,其他两个框架,不知道有没有封装多线程批量下载图片的方法。
当然我比较菜,没去看源码。