|
异步加载远程图片的小DEMO,欢迎拍砖
以下是VIEW代码 package org.mrjeye.android.image;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
/**
* 异步加载远程图片VIEW
*
* @author <a href=”mailto:admin@mrjeye.org”>Mr.J</a> 2011-3-30
*
* @version 1.0
*/
public class RemoteImageView extends SurfaceView implements SurfaceHolder.Callback{
private static final String TAG = RemoteImageView.class.getName();
private SurfaceHolder holder = null;
// 图片数据(通过加载而得)
private byte[] data;
// 要加载的图片URL
private String url;
// 标识当前图片是否正在加载过程中
private boolean loading;
public RemoteImageView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
holder = getHolder();
holder.addCallback(this);
if(attrs != null) {
url = attrs.getAttributeValue(null, “url”);
}
if(url == null || url.equals(“”)) {
return;
}
loadImageData(url);
}
public RemoteImageView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public RemoteImageView(Context context) {
this(context, null);
}
/**
* 异步加载图片
*
* @param url 加载的图片URL
*/
private void loadImageData(final String url) {
loading = true;
new Thread(){
@Override
public void run() {
try {
Thread.sleep(200);
} catch (InterruptedException e) {
}
_draw(); // 打开欢迎信息
data = getByteByUrl(url);
loading = false;
_draw();
}
}.start();
}
/**
* 设置新的图片
*
* @param url
*/
public void setUrl(String url) {
this.url = url;
if(url == null || url.equals(“”)) {
Log.d(TAG, “the remote url can not be null”);
return;
}
Log.d(TAG, “set remote image url : “+url);
loadImageData(url);
}
/**
* 画当前状态或已加载成功的图片
*
*/
private void _draw() {
Canvas canvas = holder.lockCanvas(null);
if(canvas == null) {
Log.d(TAG, “can not lock canvas from holder”);
return;
}
__draw(canvas);
holder.unlockCanvasAndPost(canvas);
}
private void __draw(Canvas canvas) {
Paint paint = new Paint();
paint.setColor(Color.WHITE);
if(loading) {
canvas.drawText(“Loading …”, 0, 20, paint);
return;
}
if(data == null || data.length == 0 ) {
Log.d(TAG, “can not drawing the remote image : data is null”);
canvas.drawText(“the url (“+url+”) is not a image resource”, 0, 20, paint);
return;
}
try {
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
canvas.drawColor(Color.BLACK);
canvas.drawBitmap(bitmap, null, new Rect(0, 0, getWidth(), getHeight()), new Paint());
} catch (Exception e) {
canvas.drawText(e.getMessage(), 0, 20, paint);
}
Log.d(TAG, “draw completed, data len : “+data.length);
}
/**
* 加载图片流
*
* @param url 图片地址
*
* @return
*/
private byte[] getByteByUrl(String url) {
URL _url = null;
HttpURLConnection connection = null;
InputStream is = null;
ByteArrayOutputStream bos = null;
byte[] ret = null;
try {
_url = new URL(url);
connection = (HttpURLConnection) _url.openConnection();
connection.setDoInput(true);
is = connection.getInputStream();
bos = new ByteArrayOutputStream();
byte[] buff = new byte[512];
int len = -1;
while((len = is.read(buff))!=-1) {
bos.write(buff, 0, len);
}
ret = bos.toByteArray();
} catch (Exception e0) {
Log.e(TAG, e0.getMessage());
return null;
} finally {
try {bos.close();} catch(Exception e){};
try {is.close();} catch(Exception e){};
try {connection.disconnect();} catch(Exception e){};
}
return ret;
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}
@Override
public void surfaceCreated(SurfaceHolder holder) {}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {}
} |
|