Fresco 图片框架简单使用

龚勇锐
2023-12-01

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直接加载图片

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获取下载的图片数据

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());
 类似资料: