Fresco 是一个Android的强大的图片加载组件。
官网:https://www.fresco-cn.org/
GitHub:https://github.com/facebook/fresco
Demo: https://github.com/liaohuqiu/fresco-demo-for-gradle
在项目的build.gradle中引入Fresco,版本号可以用当前最新的
dependencies {
implementation 'com.facebook.fresco:fresco:2.6.0'
}
因为需要下载图片,需要网络权限,在项目的AndroidManifest.xml需要有联网权限:
<uses-permission android:name="android.permission.INTERNET" />
Fresco需要初始化一次,比如可以在Application的onCreate中。
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
Fresco.initialize(this);
}
}
Drawee是Fresco管理下的ImageView。使用他需要先完成前文的 使用前准备
xml文件加入要展示的图片
<com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/my_image_view"
android:layout_width="130dp"
android:layout_height="130dp"
/>
配置图片链接:
Uri uri = Uri.parse("https://img.alicdn.com/imgextra/i1/O1CN01NbMTSC22uUSxV99qv_!!6000000007180-2-tps-720-614.png");
SimpleDraweeView draweeView = (SimpleDraweeView) findViewById(R.id.my_image_view);
draweeView.setImageURI(uri);
Image pipeline 负责完成加载图像。使用他需要先完成前文的 使用前准备
下面是完成下载图片的回调,成功后调用onNewResultImpl返回bitmap是图片渲染信息。需要注意的是onNewResultImpl和onFailureImpl里面会调用dataSource.close(),这个dataSource后面是不能复用的,而且自己管理dataSource的话(比如直接取缓存的图片)需要close,否则内存泄露。
UiThreadImmediateExecutorService是默认提供的线程池,会使回调都在主线程。
ImageRequestBuilder requestBuilder = ImageRequestBuilder.newBuilderWithSource(uri);
ImageRequest imageRequest = requestBuilder.build();
DataSource<CloseableReference<CloseableImage>> dataSource = ImagePipelineFactory.getInstance().getImagePipeline().fetchDecodedImage(imageRequest, null);
BaseBitmapDataSubscriber subscriber = new BaseBitmapDataSubscriber() {
@Override
protected void onNewResultImpl(@Nullable Bitmap bitmap) {
//下载成功
}
@Override
protected void onFailureImpl(@NonNull DataSource<CloseableReference<CloseableImage>> dataSource) {
String failMsg = dataSource.getFailureCause().getMessage();
//下载失败
}
//请求结束前就取消时回调
@Override
public void onCancellation(@NonNull DataSource<CloseableReference<CloseableImage>> dataSource) {
super.onCancellation(dataSource);
}
//请求进度回调
@Override
public void onProgressUpdate(@NonNull DataSource<CloseableReference<CloseableImage>> dataSource) {
super.onProgressUpdate(dataSource);
}
};
dataSource.subscribe(subscriber, UiThreadImmediateExecutorService.getInstance());