package net.dev123.yibo.service.task; import java.net.URL; import net.dev123.commons.ImageInfo; import net.dev123.commons.ImageInfo.Format; import net.dev123.commons.util.StringUtil; import net.dev123.exception.ExceptionCode; import net.dev123.exception.LibException; import net.dev123.yibo.MicroBlogActivity; import net.dev123.yibo.YiBoApplication; import net.dev123.yibo.common.CacheManager; import net.dev123.yibo.common.Constants; import net.dev123.yibo.common.GlobalVars; import net.dev123.yibo.common.ImageUtil; import net.dev123.yibo.common.NetType; import net.dev123.yibo.common.ResourceBook; import net.dev123.yibo.service.adapter.StatusUtil; import net.dev123.yibo.service.cache.ImageCache; import net.dev123.yibo.service.cache.wrap.CachedImage; import net.dev123.yibo.service.cache.wrap.CachedImageKey; import android.content.Context; import android.graphics.Bitmap; import android.os.AsyncTask; import android.util.DisplayMetrics; import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.ProgressBar; import android.widget.TextView; import android.widget.Toast; /* * 要确保进度条在imageView 后面 */ public class ImageLoad4ThumbnailTask extends AsyncTask<net.dev123.mblog.entity.Status, Void, CachedImage> { private static final String TAG = "ImageLoad4ThumbnailTask"; private static final String NET_EASE_TAG = "_thumbnail"; private ImageCache imageCache; private ImageView imageView; private TextView tvImageInfo; private CachedImageKey key; private String url; private boolean isHit = false; private Bitmap bitmap; private CachedImage wrap = null; private ProgressBar pBar; private String orignUrl; private String resultMsg; public ImageLoad4ThumbnailTask(ImageView imageView, String url) { this.imageView = imageView; this.orignUrl = url; if (isNetEase(url)) { this.url = url + NET_EASE_TAG; } else { this.url = url; } Context context = imageView.getContext(); ViewGroup viewGroup = (ViewGroup)imageView.getParent(); if (context instanceof MicroBlogActivity) { this.pBar = (ProgressBar)viewGroup.getChildAt(1); this.tvImageInfo = (TextView)((ViewGroup)viewGroup.getParent()).getChildAt(1); } else { View view = viewGroup.getChildAt(1); if (view instanceof TextView) { this.tvImageInfo = (TextView)viewGroup.getChildAt(1); } } init(); } private void init() { imageCache = (ImageCache)CacheManager.getInstance().getCache(ImageCache.class.getName()); //if (Constants.DEBUG) imageCache.stat(); key = new CachedImageKey(url, CachedImageKey.IMAGE_THUMBNAIL); if (url != null && (wrap = imageCache.get(key)) != null) { bitmap = wrap.getWrap(); isHit = true; } } @Override protected void onPreExecute() { super.onPreExecute(); if (tvImageInfo != null) { tvImageInfo.setVisibility(View.GONE); tvImageInfo.setText(""); } if (isHit && imageView != null) { cancel(true); onPostExecute(wrap); return; } if (GlobalVars.NET_TYPE == NetType.NONE) { cancel(true); resultMsg = ResourceBook.getStatusCodeValue(ExceptionCode.NET_UNCONNECTED, imageView.getContext()); onPostExecute(null); } } @Override protected CachedImage doInBackground(net.dev123.mblog.entity.Status... params) { if (imageView == null || url == null) { return wrap; } String bigImageUrl = null; if (params.length == 1) { net.dev123.mblog.entity.Status status = params[0]; bigImageUrl = StatusUtil.getBigImageUrl(status); } if(Constants.DEBUG) Log.d(TAG, "Get thumbnail image from remote!"); try { byte[] imageData = ImageUtil.getByteArrayByUrl(orignUrl); bitmap = ImageUtil.decodeByteArray(imageData); if (bitmap == null) { return null; } wrap = new CachedImage(bitmap); int maxWidth = 120 * YiBoApplication.getDensityDpi() / DisplayMetrics.DENSITY_DEFAULT; if (isNetEase(orignUrl) && (bitmap.getWidth() > maxWidth || bitmap.getHeight() > maxWidth)) { CachedImage midImgWrap = new CachedImage(bitmap); CachedImageKey midImgInfo = new CachedImageKey(orignUrl, CachedImageKey.IMAGE_MIDDLE); //直接写入文件,不使用bitmap的压缩写入 ImageCache.write(midImgInfo, imageData); midImgWrap.setLocalCached(true); imageCache.put(midImgInfo, midImgWrap); Bitmap thumbnailMap = ImageUtil.scaleBitmapTo(bitmap, maxWidth); //销毁网易的中图 if (!(thumbnailMap == bitmap || bitmap.isRecycled())) { bitmap.recycle(); } bitmap = thumbnailMap; wrap = new CachedImage(bitmap); } else { //直接写入文件,不使用bitmap的压缩写入 ImageCache.write(key, imageData); wrap.setLocalCached(true); } /**加入cache中**/ imageCache.put(key, wrap); //获取ImageInfo; if (GlobalVars.IS_DETECT_IAMGE_INFO && StringUtil.isNotEmpty(bigImageUrl) && key != null) { try { ImageInfo imageInfo = null; URL imageUrl = new URL(bigImageUrl); imageInfo = ImageInfo.getImageInfo(imageUrl); wrap.setImageInfo(imageInfo); } catch (Exception e) { if(Constants.DEBUG) Log.e(TAG, e.getMessage(), e); } } } catch (LibException e) { if(Constants.DEBUG) Log.e(TAG, e.getMessage(), e); resultMsg = ResourceBook.getStatusCodeValue(e.getExceptionCode(), imageView.getContext()); } return wrap; } @Override protected void onPostExecute(CachedImage result) { super.onPostExecute(result); if (result != null) { imageView.setVisibility(View.VISIBLE); imageView.setImageBitmap(bitmap); if (Constants.DEBUG) Log.v(TAG, "update imageview"); ImageInfo imageInfo = wrap.getImageInfo(); if (tvImageInfo != null && imageInfo != null && (imageInfo.getSize() > Constants.IMAGE_SIZE_THRESHOLD || imageInfo.getFormat() == Format.GIF)) { tvImageInfo.setVisibility(View.VISIBLE); tvImageInfo.setText(imageInfo.getFormat() + " " + imageInfo.getDisplaySize()); } } else { imageView.setVisibility(View.GONE); if (Constants.DEBUG && resultMsg != null) { Toast.makeText(imageView.getContext(), resultMsg, Toast.LENGTH_SHORT).show(); } } if (pBar != null) { imageView.setVisibility(View.VISIBLE); pBar.setVisibility(View.GONE); } } private boolean isNetEase(String url) { if (StringUtil.isEmpty(url)) { return false; } return url.indexOf(Constants.NET_EASE_IMAGE_URL_PREFIX) != -1; } }