您的位置:首页 > 移动开发 > Android开发

xUtils 中的BitmapUtils 一些注释

2016-07-21 09:30 501 查看
/**

* 加载图片工具类

* @author afu

*

*/

public class BitmapUtils implements TaskHandler {

/**

* 判断任务是否暂停

*/

private boolean pauseTask = false;

/**

* 是否取消所有任务

*/

private boolean cancelAllTask = false;

private final Object pauseTaskLock = new Object();

/**

* Android上下文

*/
private Context context;

private BitmapGlobalConfig globalConfig;

private BitmapDisplayConfig defaultDisplayConfig;

/////////////////////////////////////////////// create ///////////////////////////////////////////////////

/**

*

* @param context 上下文

*/

public BitmapUtils(Context context) {

this(context, null);

}

/**

*

* @param context 上下文

* @param diskCachePath 磁盘高速缓存路径

*/

public BitmapUtils(Context context, String diskCachePath) {

if (context == null) {

throw new IllegalArgumentException("context may not be null");

}

this.context = context.getApplicationContext();

globalConfig = BitmapGlobalConfig.getInstance(this.context, diskCachePath);

defaultDisplayConfig = new BitmapDisplayConfig();

}

/**

*

* @param context 上下文

* @param diskCachePath 磁盘高速缓存路径

* @param memoryCacheSize 内存缓存空间大小

*/

public BitmapUtils(Context context, String diskCachePath, int memoryCacheSize) {

this(context, diskCachePath);

globalConfig.setMemoryCacheSize(memoryCacheSize);

}

/**

*

* @param context 上下文

* @param diskCachePath 磁盘高速缓存路径

* @param memoryCacheSize 内存缓存空间大小

* @param diskCacheSize 磁盘高速缓存空间大小

*/

public BitmapUtils(Context context, String diskCachePath, int memoryCacheSize, int diskCacheSize) {

this(context, diskCachePath);

globalConfig.setMemoryCacheSize(memoryCacheSize);

globalConfig.setDiskCacheSize(diskCacheSize);

}

/**

*

* @param context 上下文

* @param diskCachePath 磁盘高速缓存路径

* @param memoryCachePercent 内存缓存百分比

*/

public BitmapUtils(Context context, String diskCachePath, float memoryCachePercent) {

this(context, diskCachePath);

globalConfig.setMemCacheSizePercent(memoryCachePercent);

}

/**

*

* @param context 上下文

* @param diskCachePath 磁盘高速缓存路径

* @param memoryCachePercent 内存缓存百分比

* @param diskCacheSize 磁盘缓存空间大小

*/

public BitmapUtils(Context context, String diskCachePath, float memoryCachePercent, int diskCacheSize) {

this(context, diskCachePath);

globalConfig.setMemCacheSizePercent(memoryCachePercent);

globalConfig.setDiskCacheSize(diskCacheSize);

}

//config 配置

/**

* 配置默认加载drawable类型资源图片

* @param drawable

* @return

*/

public BitmapUtils configDefaultLoadingImage(Drawable drawable) {

defaultDisplayConfig.setLoadingDrawable(drawable);

return this;

}

/**

* 配置默认加载资源id类型资源图片

* @param resId

* @return

*/

public BitmapUtils configDefaultLoadingImage(int resId) {

defaultDisplayConfig.setLoadingDrawable(context.getResources().getDrawable(resId));

return this;

}

/**

* 配置默认加载图片

* @param bitmap bitmap类中的资源图片

* @return

*/

public BitmapUtils configDefaultLoadingImage(Bitmap bitmap) {

defaultDisplayConfig.setLoadingDrawable(new BitmapDrawable(context.getResources(), bitmap));

return this;

}

/**

* 设置默认加载失败的图片

* @param drawable drawable类型的资源图片

* @return

*/

public BitmapUtils configDefaultLoadFailedImage(Drawable drawable) {

defaultDisplayConfig.setLoadFailedDrawable(drawable);

return this;

}

/**

* 配置默认加载失败图片,加载id类型资源图片

* @param resId

* @return

*/

public BitmapUtils configDefaultLoadFailedImage(int resId) {

defaultDisplayConfig.setLoadFailedDrawable(context.getResources().getDrawable(resId));

return this;

}

/**

* 配置默认加载失败图片,加载Bitmap类型资源图片

* @param bitmap

* @return

*/

public BitmapUtils configDefaultLoadFailedImage(Bitmap bitmap) {

defaultDisplayConfig.setLoadFailedDrawable(new BitmapDrawable(context.getResources(), bitmap));

return this;

}

/**

* 配置默认图片最大宽和高

* @param maxWidth 最大宽

* @param maxHeight 最大高

* @return

*/

public BitmapUtils configDefaultBitmapMaxSize(int maxWidth, int maxHeight) {

defaultDisplayConfig.setBitmapMaxSize(new BitmapSize(maxWidth, maxHeight));

return this;

}

/**

* 配置默认位图最大图片参数

* @param maxSize 最大图片参数类

* @return

*/

public BitmapUtils configDefaultBitmapMaxSize(BitmapSize maxSize) {

defaultDisplayConfig.setBitmapMaxSize(maxSize);

return this;

}

/**

* 配置默认图片加载动画

* @param animation 动画

* @return

*/

public BitmapUtils configDefaultImageLoadAnimation(Animation animation) {

defaultDisplayConfig.setAnimation(animation);

return this;

}

/**

* 配置默认自动旋转动画

* @param autoRotation

* @return

*/

public BitmapUtils configDefaultAutoRotation(boolean autoRotation) {

defaultDisplayConfig.setAutoRotation(autoRotation);

return this;

}

/**

* 配置默认是否显示原始图片

* @param showOriginal true:显示原始图片,false:将会对图片压缩处理

* @return

*/

public BitmapUtils configDefaultShowOriginal(boolean showOriginal) {

defaultDisplayConfig.setShowOriginal(showOriginal);

return this;

}

/**

* 配置默认图片配置,传入Bitmap.Config类型

* @param config

* @return

*/

public BitmapUtils configDefaultBitmapConfig(Bitmap.Config config) {

defaultDisplayConfig.setBitmapConfig(config);

return this;

}

/**

* 配置默认显示配置

* @param displayConfig

* @return

*/

public BitmapUtils configDefaultDisplayConfig(BitmapDisplayConfig displayConfig) {

defaultDisplayConfig = displayConfig;

return this;

}

/**

* 配置下载参数

* @param downloader

* @return

*/

public BitmapUtils configDownloader(Downloader downloader) {

globalConfig.setDownloader(downloader);

return this;

}

/**

* 配置默认缓存失效

* @param defaultExpiry

* @return

*/

public BitmapUtils configDefaultCacheExpiry(long defaultExpiry) {

globalConfig.setDefaultCacheExpiry(defaultExpiry);

return this;

}

/**

* 配置默认链接时间超时时间

* @param connectTimeout 毫秒单位

* @return

*/

public BitmapUtils configDefaultConnectTimeout(int connectTimeout) {

globalConfig.setDefaultConnectTimeout(connectTimeout);

return this;

}

/**

* 配置默认读取超时时间

* @param readTimeout 毫秒

* @return

*/

public BitmapUtils configDefaultReadTimeout(int readTimeout) {

globalConfig.setDefaultReadTimeout(readTimeout);

return this;

}

/**

* 配置线程池多少

* @param threadPoolSize 线程池数

* 此参数没有设置,默认是设置5个核心线程池

* @return

*/

public BitmapUtils configThreadPoolSize(int threadPoolSize) {

globalConfig.setThreadPoolSize(threadPoolSize);

return this;

}

/**

* 配置内存缓存是否启用,默认是启用的

* @param enabled

* @return

*/

public BitmapUtils configMemoryCacheEnabled(boolean enabled) {

globalConfig.setMemoryCacheEnabled(enabled);

return this;

}

/**

* 配置磁盘缓存功能,默认是启用的

* @param enabled

* @return

*/

public BitmapUtils configDiskCacheEnabled(boolean enabled) {

globalConfig.setDiskCacheEnabled(enabled);

return this;

}

/**

* 配置原始磁盘缓存文件名称

* @param fileNameGenerator

* @return

*/

public BitmapUtils configDiskCacheFileNameGenerator(FileNameGenerator fileNameGenerator) {

globalConfig.setFileNameGenerator(fileNameGenerator);

return this;

}

/**

* 配置位图缓存监听

* @param listener

* @return

*/

public BitmapUtils configBitmapCacheListener(BitmapCacheListener listener) {

globalConfig.setBitmapCacheListener(listener);

return this;

}

////////////////////////// display 显示////////////////////////////////////

/**

* 根据图片路径,显示到具体的View上

* @param container 要把图片显示到的View

* @param uri 图片路径

*/

public <T extends View> void display(T container, String uri) {

display(container, uri, null, null);

}

/**

* 根据图片路径,显示到具体的View上

* @param container 要把图片显示到的View

* @param uri 图片路径

* @param displayConfig

*/

public <T extends View> void display(T container, String uri, BitmapDisplayConfig displayConfig) {

display(container, uri, displayConfig, null);

}

/**

* 根据图片路径,显示到具体的View上

* @param container 要把图片显示到的View

* @param uri 图片路径

* @param callBack 加载过程回调各种状态

*/

public <T extends View> void display(T container, String uri, BitmapLoadCallBack<T> callBack) {

display(container, uri, null, callBack);

}

/**

* 根据图片路径,显示到具体的View上

* @param container 要把图片显示到的View

* @param uri 图片路径

* @param displayConfig 位图显示配置

* @param callBack

*/

public <T extends View> void display(T container, String uri, BitmapDisplayConfig displayConfig, BitmapLoadCallBack<T> callBack) {

if (container == null) {

return;

}

if (callBack == null) {

callBack = new DefaultBitmapLoadCallBack<T>();

}

if (displayConfig == null || displayConfig == defaultDisplayConfig) {

displayConfig = defaultDisplayConfig.cloneNew();

}

// Optimize Max Size

BitmapSize size = displayConfig.getBitmapMaxSize();

displayConfig.setBitmapMaxSize(BitmapCommonUtils.optimizeMaxSizeByView(container, size.getWidth(), size.getHeight()));

container.clearAnimation();

if (TextUtils.isEmpty(uri)) {

callBack.onLoadFailed(container, uri, displayConfig.getLoadFailedDrawable());

return;

}

// start loading

callBack.onPreLoad(container, uri, displayConfig);

// find bitmap from mem cache.

Bitmap bitmap = globalConfig.getBitmapCache().getBitmapFromMemCache(uri, displayConfig);

if (bitmap != null) {

callBack.onLoadStarted(container, uri, displayConfig);

callBack.onLoadCompleted(

container,

uri,

bitmap,

displayConfig,

BitmapLoadFrom.MEMORY_CACHE);

} else if (!bitmapLoadTaskExist(container, uri, callBack)) {

final BitmapLoadTask<T> loadTask = new BitmapLoadTask<T>(container, uri, displayConfig, callBack);

// get executor

PriorityExecutor executor = globalConfig.getBitmapLoadExecutor();

File diskCacheFile = this.getBitmapFileFromDiskCache(uri);

boolean diskCacheExist = diskCacheFile != null && diskCacheFile.exists();

if (diskCacheExist && executor.isBusy()) {

executor = globalConfig.getDiskCacheExecutor();

}

// set loading image

Drawable loadingDrawable = displayConfig.getLoadingDrawable();

callBack.setDrawable(container, new AsyncDrawable<T>(loadingDrawable, loadTask));

loadTask.setPriority(displayConfig.getPriority());

loadTask.executeOnExecutor(executor);

}

}

/////////////////////////////////////////////// cache 缓存相关/////////////////////////////////////////////////////////////////

/**

* 清除内存和磁盘缓存

*/

public void clearCache() {

globalConfig.clearCache();

}

/**

* 清除内存缓存

*/

public void clearMemoryCache() {

globalConfig.clearMemoryCache();

}

/**

* 清除磁盘缓存

*/

public void clearDiskCache() {

globalConfig.clearDiskCache();

}

/**

* 根据uri清除内存缓存和磁盘缓存

* @param uri

*/

public void clearCache(String uri) {

globalConfig.clearCache(uri);

}

/**

* 根据uri清除内存缓存

* @param uri

*/

public void clearMemoryCache(String uri) {

globalConfig.clearMemoryCache(uri);

}

/**

* 根据uri清除磁盘缓存

* @param uri

*/

public void clearDiskCache(String uri) {

globalConfig.clearDiskCache(uri);

}

/**

* 刷新缓存

*/

public void flushCache() {

globalConfig.flushCache();

}

/**

* 关闭缓存

*/

public void closeCache() {

globalConfig.closeCache();

}

/**

* 根据uri从磁盘缓存得到位图文件

* @param uri

* @return

*/

public File getBitmapFileFromDiskCache(String uri) {

return globalConfig.getBitmapCache().getBitmapFileFromDiskCache(uri);

}

/**

* 根据uri和位图显示配置从磁盘缓存得到位图文件

* @param uri

* @param config

* @return

*/

public Bitmap getBitmapFromMemCache(String uri, BitmapDisplayConfig config) {

if (config == null) {

config = defaultDisplayConfig;

}

return globalConfig.getBitmapCache().getBitmapFromMemCache(uri, config);

}

////////////////////////////////////////// tasks 任务//////////////////////////////////////////////////////////////////////

/**

* 支持暂停

*/

@Override

public boolean supportPause() {

return true;

}

/**

* 支持重新开始

*/

@Override

public boolean supportResume() {

return true;

}

/**

* 支持取消

*/

@Override

public boolean supportCancel() {

return true;

}

/**

* 暂停

*/

@Override

public void pause() {

pauseTask = true;

flushCache();

}

/**

* 刷新

*/

@Override

public void resume() {

pauseTask = false;

synchronized (pauseTaskLock) {

pauseTaskLock.notifyAll();

}

}

/**

* 取消

*/

@Override

public void cancel() {

pauseTask = true;

cancelAllTask = true;

synchronized (pauseTaskLock) {

pauseTaskLock.notifyAll();

}

}

/**

* 是否暂停

*/

@Override

public boolean isPaused() {

return pauseTask;

}

/**

* 是否是取消了

*/

@Override

public boolean isCancelled() {

return cancelAllTask;

}

////////////////////////////////////////////////下面这些方法是否没有提供给开发者使用的///////////////////////////////////////////////////////////////

@SuppressWarnings("unchecked")

private static <T extends View> BitmapLoadTask<T> getBitmapTaskFromContainer(T container, BitmapLoadCallBack<T> callBack) {

if (container != null) {

final Drawable drawable = callBack.getDrawable(container);

if (drawable instanceof AsyncDrawable) {

final AsyncDrawable<T> asyncDrawable = (AsyncDrawable<T>) drawable;

return asyncDrawable.getBitmapWorkerTask();

}

}

return null;

}

private static <T extends View> boolean bitmapLoadTaskExist(T container, String uri, BitmapLoadCallBack<T> callBack) {

final BitmapLoadTask<T> oldLoadTask = getBitmapTaskFromContainer(container, callBack);

if (oldLoadTask != null) {

final String oldUrl = oldLoadTask.uri;

if (TextUtils.isEmpty(oldUrl) || !oldUrl.equals(uri)) {

oldLoadTask.cancel(true);

} else {

return true;

}

}

return false;

}

public class BitmapLoadTask<T extends View> extends PriorityAsyncTask<Object, Object, Bitmap> {

private final String uri;

private final WeakReference<T> containerReference;

private final BitmapLoadCallBack<T> callBack;

private final BitmapDisplayConfig displayConfig;

private BitmapLoadFrom from = BitmapLoadFrom.DISK_CACHE;

public BitmapLoadTask(T container, String uri, BitmapDisplayConfig config, BitmapLoadCallBack<T> callBack) {

if (container == null || uri == null || config == null || callBack == null) {

throw new IllegalArgumentException("args may not be null");

}

this.containerReference = new WeakReference<T>(container);

this.callBack = callBack;

this.uri = uri;

this.displayConfig = config;

}

@Override

protected Bitmap doInBackground(Object... params) {

synchronized (pauseTaskLock) {

while (pauseTask && !this.isCancelled()) {

try {

pauseTaskLock.wait();

if (cancelAllTask) {

return null;

}

} catch (Throwable e) {

}

}

}

Bitmap bitmap = null;

// get cache from disk cache

if (!this.isCancelled() && this.getTargetContainer() != null) {

this.publishProgress(PROGRESS_LOAD_STARTED);

bitmap = globalConfig.getBitmapCache().getBitmapFromDiskCache(uri, displayConfig);

}

// download image

if (bitmap == null && !this.isCancelled() && this.getTargetContainer() != null) {

bitmap = globalConfig.getBitmapCache().downloadBitmap(uri, displayConfig, this);

from = BitmapLoadFrom.URI;

}

return bitmap;

}

public void updateProgress(long total, long current) {

this.publishProgress(PROGRESS_LOADING, total, current);

}

private static final int PROGRESS_LOAD_STARTED = 0;

private static final int PROGRESS_LOADING = 1;

@Override

protected void onProgressUpdate(Object... values) {

if (values == null || values.length == 0) return;

final T container = this.getTargetContainer();

if (container == null) return;

switch ((Integer) values[0]) {

case PROGRESS_LOAD_STARTED:

callBack.onLoadStarted(container, uri, displayConfig);

break;

case PROGRESS_LOADING:

if (values.length != 3) return;

callBack.onLoading(container, uri, displayConfig, (Long) values[1], (Long) values[2]);

break;

default:

break;

}

}

@Override

protected void onPostExecute(Bitmap bitmap) {

final T container = this.getTargetContainer();

if (container != null) {

if (bitmap != null) {

callBack.onLoadCompleted(

container,

this.uri,

bitmap,

displayConfig,

from);

} else {

callBack.onLoadFailed(

container,

this.uri,

displayConfig.getLoadFailedDrawable());

}

}

}

@Override

protected void onCancelled(Bitmap bitmap) {

synchronized (pauseTaskLock) {

pauseTaskLock.notifyAll();

}

}

public T getTargetContainer() {

final T container = containerReference.get();

final BitmapLoadTask<T> bitmapWorkerTask = getBitmapTaskFromContainer(container, callBack);

if (this == bitmapWorkerTask) {

return container;

}

return null;

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android