由于工作原因,把主流的图片加载框架都简单实现了一遍,在此记录。
Glide
Glide提供了丰富的api,封装了三级缓存,图片调整等操作。
只需要url 和 imageView就可以完成加载图片
Glide.with(this)
.load("http://01.imgmini.eastday.com/mobile/20180724/20180724075423_c7794e7e26733e24f90ffe12e3512888_7_mwpm_03200403.jpg")
.into(imageView);
Picasso
Picasso和Glide同样强大,并且API十分相似,但是Glide在图片压缩的处理上做得更好。
Picasso.get()
.load("http://01.imgmini.eastday.com/mobile/20180724/20180724075423_c7794e7e26733e24f90ffe12e3512888_7_mwpm_03200403.jpg")
.into(imageView);
ImageLoader
ImageLoader需要在setContentView()前先完成初始化
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(this).build()
ImageLoader.getInstance().init(config);
再到具体的需要的地方通过以下函数实现
ImageLoader.getInstance().displayImage("http://01.jpg",imageView);
Fresco
Fresco需要在setContentView()前先完成初始化
Fresco.initialize(this);
并且使用facebook包下的view
<com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/my_image_view"
android:layout_width="130dp"
android:layout_height="130dp"
/>
通过setImageURI就可以实现图片加载
Uri uri = Uri.parse("http://01.imgmini.eastday.com/mobile/20180724/20180724075423_c7794e7e26733e24f90ffe12e3512888_7_mwpm_03200403.jpg");
ImageView testImageView = findViewById(R.id.my_image_view);
testImageView.setImageURI(uri);
Okhttp
基于通讯框架实现图片加载,就得先下载该图片,在加载进ImageView,由于是异步所以通过Handler实现UI线程通讯
OkHttpClient client = new OkHttpClient();
final Request request = new Request.Builder()
.get()
.url("http://01.imgmini.eastday.com/mobile/20180724/20180724075423_c7794e7e26733e24f90ffe12e3512888_7_mwpm_03200403.jpg")
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Toast.makeText(MainActivity.this,"failure ",Toast.LENGTH_LONG).show();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if (response.isSuccessful()){
Message message = handler.obtainMessage();
message.what = IS_SUCCESSFUL;
message.obj = response.body().bytes();
handler.sendMessage(message);
}else{
handler.sendEmptyMessage(IS_FAILED);
}
}
});
Retrofit
retrofit的实现图片加载的流程与OkHttp框架是一样的
先实现子域名的接口
public interface
IGetPicture {
@GET("mobile/20180724/20180724075423_c7794e7e26733e24f90ffe12e3512888_7_mwpm_03200403.jpg")
Call<ResponseBody> getCall();
}
再基于Retrofit发送
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://01.imgmini.eastday.com/")
.build();
IGetPicture iGetPicture = retrofit.create(IGetPicture.class);
retrofit2.Call<ResponseBody> response = iGetPicture.getCall();
// Toast.makeText(this,response.request().url().toString(),Toast.LENGTH_LONG).show();
response.enqueue(new retrofit2.Callback<ResponseBody>() {
@Override
public void onResponse(retrofit2.Call<ResponseBody> call, retrofit2.Response<ResponseBody> response) {
if (response.isSuccessful()){
Message message = handler.obtainMessage();
message.what = IS_SUCCESSFUL;
try {
message.obj = response.body().bytes();
handler.sendMessage(message);
} catch (IOException e) {
e.printStackTrace();
}
}else{
handler.sendEmptyMessage(IS_FAILED);
}
}
@Override
public void onFailure(retrofit2.Call<ResponseBody> call, Throwable t) {
}
});