以下是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:<a href="%5C%22mailto:admin@mrjeye.org%5C%22">admin@mrjeye.org</a>”>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) {} }