繁体   English   中英

Android的ListView填充中的位图内存泄漏

[英]Bitmap memory leak in ListView population, android

我讨厌发布多余的问题,但是我无法终生弄清楚如何在堆上没有太多的位图内存。 它在第一个onCreate上完美膨胀,但第二次失败。 我在哪里/何时回收这些东西,@ _ o哈哈

我基本上是使用位图的数组列表,将其设置为具有自定义行布局的适配器,从而覆盖getView。

**所使用的位图是SD卡中的jpeg,//基本上是垂直滚动的图库。

       mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        setListAdapter(getAdapter());
    }//on create


    private ArrayAdapter<Bitmap> getAdapter(){
        ArrayList<Bitmap> picsII = new ArrayList<Bitmap>();
        String DIRECTORY_PATH = "/sdcard/Mustaches/";
        File file = new File(DIRECTORY_PATH);
        final String[] s = file.list();

        for(int i = 0; i<s.length; i++){
            Bitmap b = BitmapFactory.decodeFile(DIRECTORY_PATH + s[i]);
            picsII.add(b);
        }
        adapter = new ArrayAdapter<Bitmap>(this, R.layout.row, picsII){

            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
            View row;

            if (null == convertView) {
            row = mInflater.inflate(R.layout.row, null);
            } else {
            row = convertView;
            }


            ImageView iv = (ImageView) row.findViewById(R.id.imageView_row);
            iv.setImageBitmap(getItem(position));

            //some other widgets such as buttons and textviews
            //from the custom row are inflated here


            return row;
            }
        };

        return adapter;
    };

您的问题是,当位图一次可能只显示一对时,您会急于加载所有位图。

那就是您在显示任何位图之前将所有位图解码为一个数组。 这很容易耗尽您的所有内存。

您要使用的方法就是为显示的ListView行加载图像。

查看本文以获得更好的解决方案,该解决方案包括将图像加载到后台线程中并维护高速缓存。

http://android-developers.blogspot.com/2010/07/multithreading-for-performance.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM