Aync Taskは非同期で画像をダウンロードします。
もっと読む
この例はAyncTaskを利用して画像を非同期的にダウンロードし、ダウンロードする時はまずネット画像を地元のcacheディレクトリにダウンロードして保存し、imgUrlの画像ファイル名で保存します。同名のファイルがあればcacheディレクトリからローカルにロードします。
レイアウトファイルは、まず画像でビットを占めます。
この例はAyncTaskを利用して画像を非同期的にダウンロードし、ダウンロードする時はまずネット画像を地元のcacheディレクトリにダウンロードして保存し、imgUrlの画像ファイル名で保存します。同名のファイルがあればcacheディレクトリからローカルにロードします。
レイアウトファイルは、まず画像でビットを占めます。
private Context context = AsyncTaskDemo.this;
private ImageView image;
//
private String imageUrl = "http://dl.iteye.com/upload/attachment/0080/1571/2b9a099a-0a7b-3a60-909e-97a8316716cb.jpg";
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.asynctask);
getWidget();
loadImage(imageUrl);
}
/** */
public void getWidget() {
image = (ImageView) findViewById(R.id.image);
}
private void loadImage(final String imageUrl) {
ImageAsyncLoader asyncImageLoader = new ImageAsyncLoader();
//
Drawable cachedImage = asyncImageLoader.loadDrawable(context, imageUrl, new ImageCallback() {
public void imageLoaded(Drawable imageDrawable, String imageUrl) {
if (imageDrawable != null) {
image.setImageDrawable(ImageAsyncLoader.zoomDrawable(imageDrawable, ImageAsyncLoader.dip2px(context, 150), ImageAsyncLoader.dip2px(context, 150)));
}
}
});
if (cachedImage != null) {image.setImageDrawable(ImageAsyncLoader.zoomDrawable(cachedImage, ImageAsyncLoader.dip2px(context, 150), ImageAsyncLoader.dip2px(context, 150)));
}
}
画像非同期ローディング:
/**
* SoftReference 。
* , , , 。
* , Java OutOfMemory , null。
* , Cache , OutOfMemory。
*/
private HashMap> cacheMap = null;
private BlockingQueue queue = null;
private ThreadPoolExecutor executor = null;
public interface ImageCallback {
public void imageLoaded(Drawable imageDrawable, String imageUrl);
}
public ImageAsyncLoader() {
cacheMap = new HashMap>();
/**
* 、 blocking queue。
* FIFO( ) 。
* 。
* 。
* , 。
* , , 。
*/
queue = new LinkedBlockingQueue();
/**
* 2
* 10
* 180
*/
executor = new ThreadPoolExecutor(2, 10, 180, TimeUnit.SECONDS, queue);
}
public Drawable loadDrawable(final Context context, final String imageUrl, final ImageCallback imageCallback) {
if (cacheMap.containsKey(imageUrl)) {
SoftReference softReference = cacheMap.get(imageUrl);
Drawable drawable = softReference.get();
if (drawable != null) {
return drawable;
}
}
final Handler handler = new Handler() {
public void handleMessage(Message message) {
imageCallback.imageLoaded((Drawable) message.obj, imageUrl);
}
};
//
executor.execute(new Runnable() {
public void run() {
// URL
Drawable drawable = loadImageFromUrl(context, imageUrl);
//
if (null != drawable)
cacheMap.put(imageUrl, new SoftReference(drawable));
Message message = handler.obtainMessage(0, drawable);
handler.sendMessage(message);
}
});
return null;
}
// cache , imagUrl , cache
public static Drawable loadImageFromUrl(Context context, String imageUrl) {
Drawable drawable = null;
if (imageUrl == null)
return null;
String fileName = "";
// url
if (imageUrl != null && imageUrl.length() != 0) {
fileName = imageUrl.substring(imageUrl.lastIndexOf("/") + 1);
}
// ( : )
File file = new File(context.getCacheDir(), fileName);
//
if (!file.exists() && !file.isDirectory()) {
try {
//
FileOutputStream fos = new FileOutputStream(file);
InputStream is = new URL(imageUrl).openStream();
int data = is.read();
while (data != -1) {
fos.write(data);
data = is.read();
}
fos.close();
is.close();
drawable = Drawable.createFromPath(file.toString());
} catch (IOException e) {
e.printStackTrace();
}
}
//
else {
drawable = Drawable.createFromPath(file.toString());
}
return drawable;
}
常用画像の処理方法:
/**
* Drawable
*
* @param drawable
* @param w
* @param h
* @return Drawable
*/
public static Drawable zoomDrawable(Drawable drawable, int w, int h) {
int width = drawable.getIntrinsicWidth();
int height = drawable.getIntrinsicHeight();
// drawable bitmap
Bitmap oldbmp = drawableToBitmap(drawable);
// Matrix
Matrix matrix = new Matrix();
//
float scaleWidth = ((float) w / width);
float scaleHeight = ((float) h / height);
matrix.postScale(scaleWidth, scaleHeight);
//
Bitmap newbmp = Bitmap.createBitmap(oldbmp, 0, 0, width, height, matrix, true);
return new BitmapDrawable(newbmp);
}
/**
* drawable bitmap
*
* @param drawable
* @return Bitmap
*/
private static Bitmap drawableToBitmap(Drawable drawable) {
// drawable
int width = drawable.getIntrinsicWidth();
int height = drawable.getIntrinsicHeight();
Bitmap.Config config = drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565; // drawable
Bitmap bitmap = Bitmap.createBitmap(width, height, config);
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, width, height);
drawable.draw(canvas);
return bitmap;
}
/**
* :dip => px
*
* @param ctx
* @param dipValue
* @return
*/
public static int dip2px(Context ctx, int dipValue) {
final float scale = ctx.getResources().getDisplayMetrics().density;
return (int) (dipValue * scale);
}
設定ファイル: