给一个url   想弄个异步多线程加载和缓存的实现。有没有知道的?最好给代码,我研究研究,最近这个出问题了,弄不明白。切实可用的需要。拜谢@!

解决方案 »

  1.   

    又是你啊,呵呵,这个是可以的。你看一下吧。
    AsynImageLoader.javapackage cmd.cmd.weibo.imgCache;import java.io.IOException;
    import java.io.InputStream;
    import java.lang.ref.SoftReference;
    import java.net.HttpURLConnection;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.util.HashMap;
    import java.util.Map;import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.os.Handler;
    import android.os.Message;
    import android.widget.ImageView;public class AsynImageLoader {    private Map<String, SoftReference<Bitmap>> imageCache = new HashMap<String, SoftReference<Bitmap>>();    public AsynImageLoader(){
            
        }
        public synchronized void showImage(final ImageView view, final String urlStr) {        //回调。。
            CallbackImplement callbackImeplement=new CallbackImplement(view);
            
            Bitmap cacheBitmap = this.loadBitmap(urlStr,callbackImeplement);
            // 从缓存中得到图像
            if (cacheBitmap != null) {
                view.setImageBitmap(cacheBitmap);
            }    }
        public Bitmap loadBitmap(final String url,final CallbackImplement callbackImeplement) {
            // TODO Auto-generated method stub
            //从缓存中取图片
            if (imageCache.containsKey(url)) {
                SoftReference<Bitmap> sotfReference = imageCache.get(url);
                if (sotfReference.get() != null) {
                    return sotfReference.get();
                }
            }
            final Handler handler=new Handler(){            @Override
                public void handleMessage(Message msg) {
                    if(msg.what==1){
                        Bitmap bitmap=(Bitmap) msg.obj;
                        callbackImeplement.imageLoad(bitmap);
                    }
                }
                
            };
            new Thread(){
                @Override
                public void run() {
                    //下载图片
                    Bitmap bitmap=downloadImageFromUrl(url);
                    //加入缓存
                    imageCache.put(url, new SoftReference<Bitmap>(bitmap));
                    //发送消息
                    Message msg=new Message();
                    msg.what=0;
                    msg.obj=bitmap;
                    handler.sendMessage(msg);
                }
                
            }.start();
            return null;
        }
        private Bitmap downloadImageFromUrl(String urlStr){
            URL url = null;
            try {
                url = new URL(urlStr);
                HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                InputStream is = connection.getInputStream();
                Bitmap bitmap = BitmapFactory.decodeStream(is);
                return bitmap;
            } catch (MalformedURLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return null;
        }
       }CallbackImplement.javapackage cmd.cmd.weibo.imgCache;import android.graphics.Bitmap;
    import android.widget.ImageView;public class CallbackImplement implements Callback{    private ImageView imageView;
        public CallbackImplement(ImageView imageView){
            this.imageView=imageView;
        }
        @Override
        public void imageLoad(Bitmap bitmap) {
            // TODO Auto-generated method stub
            imageView.setImageBitmap(bitmap);
        }
    }Callback.javapackage cmd.cmd.weibo.imgCache;
    import android.graphics.Bitmap;public interface Callback {
        public void imageLoad(Bitmap bitmap);
        
    }
      

  2.   

    看了一遍  你的代码很干净,我看你这个是弄的imageview,我只想得到一个bitmap资源,并加入缓存,如果缓存里有的话就从缓存里面读出来,我再把bitmap画出来,我这个是要画瓦片地图,所以一个屏要画十几个bitmap,我现在用的这个缓存那有问题,总是会不断的刷着画,导致内存溢出,我的那个要求在你的代码上从哪里可以修改然后我能用呢?
      

  3.   

    按你这个我修改了下,出现内存出错的问题,和我那个很像,不过比我那个好一点的是不会一直刷新的画了 但是还是出现了内存溢出的错误
    03-27 07:23:58.161: E/dalvikvm-heap(280): 131072-byte external allocation too large for this process.
    谁能指导下是不是不应该用软引用?
      

  4.   


    SoftReference已经处理了内存问题,是不是你的瓦片地图上的代码有问题啊,可否贴出来研究一下。
      

  5.   


    你这个挺好用的  也看明白了 谢谢你啊  可是总是OOM错误,看来我这个用内存来缓存不行,还是要用file或者存到sdcard上  这个方面你又代码或者资料么?
      

  6.   


    我看网上查到的都是不完整的代码片段,你上面的这个适合于在应用中固定位置显示些小图标、图片什么的,我这个瓦片地图就不行 内存空间明显不足。有存到sdcard和从sdcard读取图片可用的代码吗?或者给个写的好的帖子,我观摩观摩  我找到一个,可是貌似应该逻辑中少一部分关键的东西
    http://blog.csdn.net/xieqibao/article/details/6682128
      

  7.   

    这个软引用应该解决不了,总是会有内存回收出现,就是刚才有的东西这回又被回收了,导致显示的总是残缺。估计是空间不足,所以感觉还是sdcard存储可能靠谱点。