java图片加载是异步的吗_异步图片加载工具类

package com.su.doubanrise.widget;

import java.io.File;

import java.lang.ref.SoftReference;

import java.util.HashMap;

import android.content.Context;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.os.Handler;

import android.os.Message;

import android.widget.ImageView;

import com.su.doubanrise.DoubanApp;

import com.su.doubanrise.R;

import com.su.doubanrise.overall.Constant;

import com.su.doubanrise.util.FileDownLoader;

import com.su.doubanrise.util.Str;

public class AsyncImageLoader {

private Context mcontext;

private HashMap> imageCache = new HashMap>();;

public AsyncImageLoader() {

this.mcontext = DoubanApp.getContext();

}

/**

* 异步加载sd卡的图片 ,

*

* @param uri

* @param imageView

* @param imageCallback

* @return

*/

private Bitmap loadBitmapFromSD(final String uri,

final ImageView imageView, final ImageCallback imageCallback) {

if (imageCache.containsKey(uri)) {

SoftReference SoftReference = imageCache.get(uri);

Bitmap bitmap = SoftReference.get();

if (bitmap != null) {

return bitmap;

}

}

final Handler handler = new Handler() {

public void handleMessage(Message msg) {

imageCallback.imageLoaded((Bitmap) msg.obj, imageView, uri);

}

};

new Thread() {

public void run() {

Bitmap bitmap = null;

bitmap = getBitmapFromFile(uri);

imageCache.put(uri, new SoftReference(bitmap));

if (!new File(uri).isFile()) {

bitmap = BitmapFactory.decodeResource(

mcontext.getResources(), R.drawable.ic_launcher);

}

Message msg = handler.obtainMessage(0, bitmap);

handler.sendMessage(msg);

bitmap = null;

}

}.start();

return null;

}

private Bitmap loadBitmapFromNet(final String url,

final ImageView imageView, final int opsize,

final ImageCallback imageCallback) {

final String savePath = Constant.PICPATH + Str.md5(url);

if (imageCache.containsKey(url)) {

Bitmap bitmap = imageCache.get(url).get();

if (bitmap != null) {

return bitmap;

}

}

final Handler handler = new Handler() {

public void handleMessage(Message msg) {

imageCallback.imageLoaded((Bitmap) msg.obj, imageView, url);

}

};

new Thread() {

public void run() {

try {

FileDownLoader.downloadImg(url, savePath);

} catch (Exception e) {

e.printStackTrace();

}

Bitmap bitmap = null;

bitmap = getBitmapFromFile(savePath, opsize);

imageCache.put(url, new SoftReference(bitmap));

if (!new File(savePath).isFile()) {

bitmap = BitmapFactory.decodeResource(

mcontext.getResources(), R.drawable.ic_launcher);

}

Message msg = handler.obtainMessage(0, bitmap);

handler.sendMessage(msg);

}

}.start();

return null;

}

private interface ImageCallback {

public void imageLoaded(Bitmap imageBitmap, ImageView imageView,

String uri);

}

/**

* 从本读读取图片

*

* @param uri

* @return

*/

private Bitmap getBitmapFromFile(String uri) {

BitmapFactory.Options options = new BitmapFactory.Options();

options.inSampleSize = 8;

Bitmap bitmap = BitmapFactory.decodeFile(uri, options);

return bitmap;

}

/**

* 从本读读取图片 添加opt参数

*

* @param uri

* @return

*/

private Bitmap getBitmapFromFile(String uri, int opsize) {

BitmapFactory.Options options = new BitmapFactory.Options();

options.inSampleSize = opsize;

options.inPurgeable = true;

Bitmap bitmap = BitmapFactory.decodeFile(uri, options);// 这里还是会出现oom??

return bitmap;

}

/**

* 最终暴露给用户的接口

*

* @param url

* @param imageView

*/

public void setAsyncBitmapFromNet(String url, ImageView imageView) {

if (url == null) {

return;

}

imageView.setImageBitmap(loadBitmapFromNet(url, imageView, 1,

new ImageCallback() {

public void imageLoaded(Bitmap imageBitmap,

ImageView imageView, String imageUrl) {

imageView.setImageBitmap(imageBitmap);

}

}));

}

/**

* 异步加载本地图片

*

* @param uri

* @param imageView

*/

public void setAsyncBitmapFromSD(String uri, ImageView imageView) {

if (uri == null) {

return;

}

imageView.setImageBitmap(loadBitmapFromSD(uri, imageView,

new ImageCallback() {

public void imageLoaded(Bitmap imageBitmap,

ImageView imageView, String imageUrl) {

imageView.setImageBitmap(imageBitmap);

}

}));

}

/**

* 由于加载本地图片时间较短 ,其实可以不使用这个方法减小线程的开销

*

* @param uri

* @param imageView

*/

public void setBitmapFromSD(String uri, ImageView imageView) {

if (uri == null) {

return;

}

imageView.setImageBitmap(getBitmapFromFile(uri));

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值