我在网上找到的一个讲解异步加载图片的例子,照着他的代码我改成这样,可是总是得不到图片,总提示bitmap = null,报空指针错误。是不是和里面的回调接口有关?这个回调接口我也不明白,指点下?逻辑我这个是没问题的,就是不知道怎么就是得不到bitmap资源。上代码。大家看看。帮个忙。
这个是传入url然后判断是否缓存里面有,没有的话从网络下载并加入缓存:代码如下:
- Java code
import java.io.IOException;import java.io.InputStream;import java.lang.ref.SoftReference;import java.net.HttpURLConnection;import java.net.URL;import java.util.HashMap;import java.util.Map;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.Handler;public class TileCheck { public Map<String, SoftReference<Bitmap>> imageCache = new HashMap<String, SoftReference<Bitmap>>(); private ExecutorService executorService = Executors.newFixedThreadPool(12); // 固定12个线程来执行任务 private final Handler handler = new Handler(); public Bitmap checkLoadBitmap(final String Url,final ImageCallback callback) { // 如果缓存过就从缓存中取出数据 if (imageCache.containsKey(Url)) { SoftReference<Bitmap> softReference = imageCache.get(Url); if (softReference.get() != null) { return softReference.get(); } } // 缓存中没有图像,则从网络上取出数据,并将取出的数据缓存到内存中 executorService.submit(new Runnable() { public void run() { try { final Bitmap bitmap = loadImageFromUrl(Url); // tileLoader.setBitmap(drawingTile);// Bitmap bitmap = drawingTile.getBitmap(); imageCache.put(Url, new SoftReference<Bitmap>(bitmap)); handler.post( new Runnable() { public void run() { callback.imageLoaded(bitmap); } }); } catch (Exception e) { throw new RuntimeException(e); } } }); return null; } // 从网络上取数据方法 private Bitmap loadImageFromUrl(String strURL) throws IOException { URL url = new URL(strURL); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setDoInput(true); conn.setConnectTimeout(1000); conn.setRequestMethod("GET"); conn.connect(); for (int i = 0; i < 1; i++) { if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) { InputStream is = conn.getInputStream(); Bitmap bm = BitmapFactory.decodeStream(is, null, null); if (is != null) { is.close(); is = null; } if (conn != null) { conn.disconnect(); conn = null; } return bm; } } return null; }// protected Bitmap loadImageFromUrl(String Url) {// try {// //// TileLoader tileLoader = new TileLoader(TileLayer);// // // // return Drawable.createFromStream(new URL(Url).openStream(),// "image.png");//// } catch (Exception e) {// throw new RuntimeException(e);// }// } // 对外界开放的回调接口 public interface ImageCallback { // 注意 此方法是用来设置目标对象的图像资源 public void imageLoaded(Bitmap bitmap); } }
我这边是调用上面的函数获取bitmap并画出来:
- Java code
String urllll = drawingTile.getTileSrc(); TileCheck tilecheck = new TileCheck(); ImageCallback callback = null; Bitmap bitmap = tilecheck.checkLoadBitmap(urllll, callback); // tileLoader.setBitmap(drawingTile);// Bitmap bitmap = drawingTile.getBitmap(); Point drawPoint = drawingTile.getScreenPos(); canvas.drawBitmap(bitmap, drawPoint.x, drawPoint.y, null);