我用这个弱引用WeakReference
但是总报空指针,我都没找出怎么出现的。
很悲剧
是不是WeakReference还有什么传说中的机关

解决方案 »

  1.   

    楼主问下,你所谓的100多K是一张图片还是几张?
      如果是一张的话,那么肯定是会outofmemery的。
      vm 肯定不够用的。
      

  2.   

    子线程里面加载图片,一般来说稍微大一点都会OOM的,除非把加载放到父线程里面来。
      

  3.   

    这是部分代码,是一个继承baseadapter的适配器,用在Gallery里面
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub
    final ImageView imgView = new ImageView(imgContext);
    imgView.setLayoutParams(new Gallery.LayoutParams(209, 123));// 设置布局图片大小
    // imgvView.setClickable(true);// 
    imgView.setScaleType(ImageView.ScaleType.CENTER_INSIDE);// 
    imgView.setBackgroundColor(0xFFFFFF);
    imgView.setPadding(5, 5, 5, 5);// 设置边框间距
    imgView.setAdjustViewBounds(true);// 保持图片高宽比
    // imgvView.setImageBitmap(urlarr[position]);// 设置图片源
    final WeakReference<ImageView> imageViewReference = new WeakReference<ImageView>(
    imgView);
    final URL tempUrl = urlarr[position]; new Thread() {
    public void run() {
    try {
    Message msg = new Message(); msg.what = 0;
    HttpURLConnection urlcon = (HttpURLConnection) tempUrl
    .openConnection();
    urlcon.setDoInput(true);
    urlcon.connect();
    InputStream is = urlcon.getInputStream();
    Bitmap tempBitmap = BitmapFactory.decodeStream(is); List<Object> myList = new ArrayList<Object>();
    myList.add(tempBitmap); myList.add(imageViewReference);
    // myList.add(imgView);
    // imgvView.setImageBitmap(tempBitmap);
    msg.obj = myList;
    is.close();
    imghHandler.sendMessage(msg); } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    }.start(); return imgView;
    } Handler imghHandler = new Handler() { /*
     * (non-Javadoc)
     * 
     * @see android.os.Handler#handleMessage(android.os.Message)
     */
    @Override
    public void handleMessage(Message msg) {
    ImageView img;
    if (msg.what == 0) {
    List list = (List) msg.obj;
    Bitmap bitmap = (Bitmap) list.get(0); img = (ImageView) ((Reference<ImageView>) list.get(1)).get(); // if (list.get(1)!=null) {
    // img = (ImageView) ((Reference<ImageView>)list.get(1)).get();
    //
    // }else {
    // //img = (ImageView) list.get(2);
    // } // ImageView img = (ImageView) ((Reference<ImageView>)
    // list.get(1)).get();
    if (img != null) {
    img.setImageBitmap(bitmap);
    } }
    super.handleMessage(msg);
    } };
      

  4.   

    法克
    我发现跟Gallery有关
    你拖动图片滚动的时候,它又重新请求一次,重新打开连接,重新设置图片,估计是这个问题导致的。
    把图片下载下来,直接读sd卡,应该就不会出现这个问题了
    等下试试
      

  5.   

    100k的图像,解码后比100k大多了
    800x600分辨率的图像RGB_565加载到内存也937k了
    你加载图像时可以加载缩略图
    BitmapFactory.Options.inSampleSize = n;
    加载时就加载图像的1/n*n。
    自己根据图像尺寸算个合适的n值
    如果你把图像放到Gallery中显示,图像再大也不会超过屏幕大小吧。
    一般屏幕320x480,480x854(800),那就加载时把图像大小不超过480*480,那你就 可以在内存中多缓存几张图片Bitmap了。同时把从网上下载的图像缓存到sd卡上。
    这样在Gallery的Adapter中加载图像时先从内存找Bitmap,找不到,到sd卡上找下载的图像重新加载,再找不到,就上网上下载,
      

  6.   

    adapter里面这么写非常逊.
    就算一张图片只有5K,一样OOME出现.我的解决办法是用OnScroll监听,然后批量下载,而不是对GetView每个下载一次.因为这个方法会下载N次.屏幕不断的刷新,不信你Log记录下.
      

  7.   

    就算是监听Onscroll同样也会下载多次,我的办法是批量下载,下载后再Notify.
    然后设置标志,下载成功的,下次不要下载,可以缓存图片,下载失败的如果是Filenotfound异常,下次也不需要再下载了.因为服务器始终是找不到东西的.http://phenom.javaeye.com/blog/756994 我是这么处理的,可以参考下.