这一节主要看看FinalBitmap的配置,它主要有哪些参数需要配置,并引出display方法
FinalBitmap finalBitmap; finalBitmap = FinalBitmap.create(this); finalBitmap.configBitmapLoadThreadSize(3); //图片大小 finalBitmap.configBitmapMaxHeight(800); finalBitmap.configBitmapMaxWidth(480); //磁盘缓存路径 finalBitmap.configDiskCachePath(""); finalBitmap.configDiskCacheSize(10*1024); //配置显示 finalBitmap.configDisplayer(new Displayer() { @Override public void loadFailDisplay(View imageView, Bitmap bitmap) { // TODO Auto-generated method stub //设置失败 显示图片 404 等等 } @Override public void loadCompletedisplay(View imageView, Bitmap bitmap, BitmapDisplayConfig config) { // TODO Auto-generated method stub // 加载成功 开启动画等等imageView.startAnimation(); } }); //可自己定义下载器 finalBitmap.configDownlader(new Downloader() { @Override public byte[] download(String urlString) { // TODO Auto-generated method stub //自己写下载代码。这个已经是异步操作了 return null; } }); //加载时显示的图片。即默认图片 finalBitmap.configLoadingImage(null); //配置内存缓存大小 finalBitmap.configMemoryCacheSize(4); //待我后面再讲 finalBitmap.configRecycleImmediately(true); finalBitmap.setExitTasksEarly(true); //开始加载,如果你实例化后直接调用此方法,上面配置参数都默认的 finalBitmap.display(imageView, "http://www.baidu.com/pic/logo.gif");我们直接进入display方法
public void display(View imageView,String uri){ doDisplay(imageView,uri,null); }
private void doDisplay(View imageView, String uri, BitmapDisplayConfig displayConfig) { if(!mInit ){ init();//用来建立缓存路径 :1.内存 2磁盘 3.实例化线程池。如果我们没有在上面配置,就会加载默认配置 } if (TextUtils.isEmpty(uri) || imageView == null) {//判断uri地址 return; } if(displayConfig == null) displayConfig = mConfig.defaultDisplayConfig; Bitmap bitmap = null; if (mImageCache != null) {//判断是否在缓存中 bitmap = mImageCache.getBitmapFromMemoryCache(uri); } if (bitmap != null) {//如果存在,直接加载 if(imageView instanceof ImageView){ ((ImageView)imageView).setImageBitmap(bitmap); }else{ imageView.setBackgroundDrawable(new BitmapDrawable(bitmap)); } }else if (checkImageTask(uri, imageView)) {//检测该任务是否已经运行了 final BitmapLoadAndDisplayTask task = new BitmapLoadAndDisplayTask(imageView, displayConfig ); //自定义Drawable ,设置默认图片 final AsyncDrawable asyncDrawable = new AsyncDrawable(mContext.getResources(), displayConfig.getLoadingBitmap(), task); if(imageView instanceof ImageView){ ((ImageView)imageView).setImageDrawable(asyncDrawable); }else{ imageView.setBackgroundDrawable(asyncDrawable); } task.executeOnExecutor(bitmapLoadAndDisplayExecutor, uri);//执行加载任务 } }大家看看任务线程
/** * bitmap下载显示的线程 * @author michael yang */ private class BitmapLoadAndDisplayTask extends AsyncTask<Object, Void, Bitmap> { private Object data; private final WeakReference<View> imageViewReference; private final BitmapDisplayConfig displayConfig; public BitmapLoadAndDisplayTask(View imageView,BitmapDisplayConfig config) { imageViewReference = new WeakReference<View>(imageView); displayConfig = config; } @Override protected Bitmap doInBackground(Object... params) { data = params[0]; final String dataString = String.valueOf(data); Bitmap bitmap = null; synchronized (mPauseWorkLock) { while (mPauseWork && !isCancelled()) { try { mPauseWorkLock.wait(); } catch (InterruptedException e) { } } } if (bitmap == null && !isCancelled()&& getAttachedImageView() != null && !mExitTasksEarly) { bitmap = processBitmap(dataString,displayConfig);//下载数据 } if(bitmap!=null){ mImageCache.addToMemoryCache(dataString, bitmap);//下载完成后加入缓存 } return bitmap; } @Override protected void onPostExecute(Bitmap bitmap) { if (isCancelled() || mExitTasksEarly) { bitmap = null; } // 判断线程和当前的imageview是否是匹配 final View imageView = getAttachedImageView(); if (bitmap != null && imageView != null) {//显示数据 mConfig.displayer.loadCompletedisplay(imageView,bitmap,displayConfig); }else if(bitmap == null && imageView!=null ){ mConfig.displayer.loadFailDisplay(imageView, displayConfig.getLoadfailBitmap()); } } @Override protected void onCancelled(Bitmap bitmap) { super.onCancelled(bitmap); synchronized (mPauseWorkLock) { mPauseWorkLock.notifyAll(); } } /** * 获取线程匹配的imageView,防止出现闪动的现象 * @return */ private View getAttachedImageView() { final View imageView = imageViewReference.get(); final BitmapLoadAndDisplayTask bitmapWorkerTask = getBitmapTaskFromImageView(imageView); if (this == bitmapWorkerTask) { return imageView; } return null; } }