一、Fresco配置
这里的配置是Fresco加载图片全局的配置,主要是设置内存缓存,磁盘缓存,图片配置等参数。负责配置相关的类是ImagePipelineConfig,在使用Fresco前需要初始化Fresco,传入的参数是ImagePipelineConfig:
Fresco.initialize(this, ImagePipelineConfigFactory.getOkHttpImagePipelineConfig(this));
下面是整个配置的一个工厂类,包含正常网络加载的配置和使用OKhttp网络库加载的配置。
public class ImagePipelineConfigFactory {
private static final int MAX_HEAP_SIZE = (int) Runtime.getRuntime().maxMemory();
public static final int MAX_DISK_CACHE_SIZE = 40 * ByteConstants.MB;
public static final int MAX_MEMORY_CACHE_SIZE = MAX_HEAP_SIZE / 4;
private static final String IMAGE_PIPELINE_CACHE_DIR = "imagepipeline_cache";
private static ImagePipelineConfig sImagePipelineConfig;
private static ImagePipelineConfig sOkHttpImagePipelineConfig;
/**
* 使用Android自带的网络加载图片
*/
public static ImagePipelineConfig getImagePipelineConfig(Context context) {
if (sImagePipelineConfig == null) {
ImagePipelineConfig.Builder configBuilder = ImagePipelineConfig.newBuilder(context);
configBuilder.setProgressiveJpegConfig(mProgressiveJpegConfig);
configBuilder.setBitmapsConfig(Bitmap.Config.ARGB_4444);
configureCaches(configBuilder, context);
configureLoggingListeners(configBuilder);
configureOptions(configBuilder);
sImagePipelineConfig = configBuilder.build();
}
return sImagePipelineConfig;
}
/**
* 使用OkHttp网络库加载图片
*/
public static ImagePipelineConfig getOkHttpImagePipelineConfig(Context context) {
if (sOkHttpImagePipelineConfig == null) {
OkHttpClient okHttpClient = new OkHttpClient();
ImagePipelineConfig.Builder configBuilder =
OkHttpImagePipelineConfigFactory.newBuilder(context, okHttpClient);
configureCaches(configBuilder, context);
configureLoggingListeners(configBuilder);
sOkHttpImagePipelineConfig = configBuilder.build();
}
return sOkHttpImagePipelineConfig;
}
/**
* 配置内存缓存和磁盘缓存
*/
private static void configureCaches(
ImagePipelineConfig.Builder configBuilder,
Context context) {
final MemoryCacheParams bitmapCacheParams = new MemoryCacheParams(
MAX_MEMORY_CACHE_SIZE, // Max total size of elements in the cache
Integer.MAX_VALUE, // Max entries in the cache
MAX_MEMORY_CACHE_SIZE, // Max total size of elements in eviction queue
Integer.MAX_VALUE, // Max length of eviction queue
Integer.MAX_VALUE); // Max cache entry size
configBuilder
.setBitmapMemoryCacheParamsSupplier(
new Supplier<MemoryCacheParams>() {
public MemoryCacheParams get() {
return bitmapCacheParams;
}
})
.setMainDiskCacheConfig(
DiskCacheConfig.newBuilder()
.setBaseDirectoryPath(context.getApplicationContext().getCacheDir())
.setBaseDirectoryName(IMAGE_PIPELINE_CACHE_DIR)
.setMaxCacheSize(MAX_DISK_CACHE_SIZE)
.build());
}
private static void configureLoggingListeners(ImagePipelineConfig.Builder configBuilder) {
Set<RequestListener> requestListeners = new HashSet<>();
requestListeners.add(new RequestLoggingListener());
configBuilder.setRequestListeners(requestListeners);
}
private static void configureOptions(ImagePipelineConfig.Builder configBuilder) {
configBuilder.setDownsampleEnabled(true);
}
//渐进式图片
static ProgressiveJpegConfig mProgressiveJpegConfig = new ProgressiveJpegConfig() {
@Override
public int getNextScanNumberToDecode(int scanNumber) {
return scanNumber + 2;
}
public QualityInfo getQualityInfo(int scanNumber) {
boolean isGoodEnough = (scanNumber >= 5);