Android 大位图加载

说明:没对图片进行缓存处理,只是使用软引用进行位图资源的释放,从而避免内存泄漏。

对位图进行解码显示:

 1 public Bitmap decodeBitmap(Resources resources, int resId, int reqWith, reqHeight ) {
 2     //对位图进行解码的参数设置
 3     BitmapFactory.Options options = new BitmapFactory.Options();
 4     //在对位图进行解码的过程中,避免申请内存空间
 5     options.inJustDecodeBounds = true;
 6     BimapFactory.decodeResource(resources, resId, options);
 7     //对图片进行一定比例的压缩处理
 8     options.inSampleSize = caculateInSimpleSize(options, reqWith, reqHeight);
 9     //真正输出位图
10     options.inJustDecodeBounds = false;
11     return BimapFactory.decodeResource(resources, resId, options);
12 }

计算图片压缩比例:

public int caculateInSimpleSize(BitmapFactory.Options options, int reqWidth, int reqHeight){
    //
    int imageHeight = options.outHeight;
    int imageWidth = options.outWidth;
    int inSimpeSize = 1; // 压缩比例
    if (imageHeight > reqHeight || imageWidth > reqWidth)  {
          final int heightRatio = Math.round((float) imageHeight  / (float) reqHeight );
          final int widthRatio = Math.round((float) imageWidth / (float) reqWidth);
          inSimpleSize = heightRatio < widthRatio ? heightRatio : widthRatio ;
    }
    return inSimpleSize;
}

网络图片请求:

 1 public static byte[] sendPost (String path){
 2      HttpClient httpClient = new DefaultHttpClient();
 3      HttpPost httpPost = new HttPost (path);
 4      HttpResponse response = null;
 5      try {
 6           response = httpClient.execute(httpPost);
 7           if (response.getStatusLine().getStatusCode() == 200) {
 8                return EntityUtils.toByteArray(response.getEntity());
 9           }
10      }  catch (Exception e) {
11            e.printStackTrace();
12      }  finally {
13            httpClient.getConnectionManager().shutdown();
14      }
15      return null;
16 }

批量加载大位图:

 1 //在adpter中的getView中处理显示
 2 public View getView(int position, View converView, ViewGroup parent) {
 3       View view = null;
 4       if (converView == null ){
 5             view = LayoutInflater.from(MainActivity.this,).inflate(R.layout.item, null);
 6       } else {
 7             view = converView;
 8       }
 9       ImageView imageView = (ImageView) view.findViewById(R.id.item_image);
10       //获取图片
11       loadBitmap(path[position], imageView);
12       return view;
13 }
//在滑动ListView时,会对旧的布局进行资源回收,如果ListView结合异步任务操作时,不能确保重用的布局被及时回收。
static class AsyncDrawable extends BitmapDrawable{
     private final SoftReference<BitmapWorkerTask> softReference;
     public AsyncDrawable (Resources resources, Bitmap bitmap, BitmapWorkerTask bitmapWorkerTask) {
           super(resources, bitmap);
           softReference = SoftReference<MainActivity.BitmapWorkerTask>(bitmapWorkerTask);
    }
     
    public BitmapWorkerTask getBitmapWorkerTask() {
           return softReference.get();
    }
}

/**异步任务**/
class BitmapWorkerTask extends AsyncTask<String, void, Bitmap> {
     private SoftReference<ImageView> imageSoftReference;
     private String data = "";

     public BitmapWorkerTask (ImageView imageView) {
           imageSoftReference = new SoftReference<ImageView>(imageView);
     }

     @Override
     protected Bitmap doInBackground (String... params) {
          data = params[0];
          byte[] result = sendPost(data);
          // 对位图解码, 返回100*100
          return decodeBitmap(result, 100, 100);
     }

     @Override
     potected void onPostExecute(Bitmap bitmap) {
           super.onPostExecute(bitmap);
           if (isCancelled()) {
                bitmap = null;
           }
           if (imageSoftReference != null && bitmap  != null) {
                final ImageView imageView = imageSoftReference.get();
                final BitmapWorkerTask bitmapWorkerTask = getBitmapWorkerTask(imageView);
                // 加载异步任务是独立的线程,保证引用imageView和异步任务有关联才可以。
                if (this == bitmapWorkerTask && imageView != null) {
                       imageView.setImageBitmap(bitmap);
                }
           } 
     }
}


private static BitmapWorkerTask getBitmapWorkerTask (ImageView imageView) {
       
       if (imageView != null) {
             final Drawable drawable = imageView.getDrawable();
             if (drawable instanceof AsyncDrawable) {
                   final AsyncDrawable asyncDrawable = (AsyncDrawable) drawable;
                   return asyncDrawable.getBitmapWorkerTask();
             }
       }
       return null;
}

// 检查是否有另外一个执行的异步任务和imageView来绑定,前一个异步任务进行取消操作
public static boolean cancelPotntialWork(String data, ImageView imageView) {
       final BitmapWorkerTask  bitmapWorkerTask = getBitmapWorkerTask(imageView);
       if (bitmapWorkerTask  != null) {
               final String bitmapData = bitmapWorkerTask.data;
               if (bitmapData != data) {
                     bitmapWorkerTask.cancel(true);
               } else {
                     return false;
               }
       }
       return true;
}

//加载图片
public void loadBitmap(String data, ImageView imageView) {
       Bitmap placeBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.empty_photo);
       if (cancelPotntialWork(data, imageView)) {
             final BitmapWorkerTask task = new BitmapWorkerTask(imageView);
             final AsyncDrawable asyncDrawable = new AsyncDrawable(getResources(), placeBitmap, task);
             imageView.setImageDrawable(asyncDrawable);
             task.execute(data);
       }
}

 

posted @ 2015-08-26 15:56  晕菜一员  阅读(485)  评论(0编辑  收藏  举报