当前位置: 代码迷 >> Android >> 请看看小弟我这个异步加载图片哪里不对
  详细解决方案

请看看小弟我这个异步加载图片哪里不对

热度:55   发布时间:2016-05-01 21:42:07.0
请看看我这个异步加载图片哪里不对?
我在网上找到的一个讲解异步加载图片的例子,照着他的代码我改成这样,可是总是得不到图片,总提示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);
  相关解决方案