0

我正在创建自己的 SlideShow 活动,其中有一个 ImageView,每次用户单击下一个或上一个时,我都会用正确的图像填充它。

这些图像虽然很大,但当我浏览其中的几个时,我得到一个 OutofMemory 可能是由于我的错误导致的内存泄漏。

问题是,每次调用新图像时,我都会尝试将前一个位图设为空,以便对其进行垃圾收集,但无济于事。

我在这里错过了什么吗?

我附上了我的活动的非常简单的代码:

public class SlideShowActivity extends Activity {
    private static final String LOG_TAG = SlideShowActivity.class.getSimpleName();

    private Bitmap currentBitmap;
    private Bitmap mDefaultBitmap;
    private ImageView imageView;
    private ImageButton buttonPrev;
    private ImageButton buttonNext;
    private int currentImageIndex;

    private String imguri[] = { "ruta1/imagen1.jpg", "ruta1/imagen2.jpg", "ruta1/imagen3.jpg", "ruta1/imagen4.jpg", "ruta1/imagen5.jpg", "ruta1/imagen6.jpg" };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.slideshow);

        mDefaultBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.noimage);
        imageView = (ImageView) findViewById(R.id.imageViewCurrentImage);
        buttonPrev = (ImageButton) findViewById(R.id.imgbuttonprev);
        buttonNext = (ImageButton) findViewById(R.id.imgbuttonnext);

        currentImageIndex = 0;
        setCurrentImage(currentImageIndex);
        buttonPrev.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                currentImageIndex--;
                if(currentImageIndex < 0)
                    currentImageIndex = imguri.length-1;

                setCurrentImage(currentImageIndex);
            }
        });

        buttonNext.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                currentImageIndex++;
                if(currentImageIndex == imguri.length)
                    currentImageIndex = 0;
                setCurrentImage(currentImageIndex);
            }
        });

    }

    private void setCurrentImage(int idx) {

        currentBitmap = null;
        imageView.setImageBitmap(null);
        try {
            currentBitmap = Bitmap.createScaledBitmap(BitmapFactory.decodeStream(getAssets().open(imguri[idx])),800, 480, true);
            imageView.setImageBitmap(currentBitmap);
        } catch (IOException e) {
            Log.d(LOG_TAG, "No se pudo abrir el recurso" + imguri[0]);
            imageView.setImageBitmap(mDefaultBitmap);
        }
    }

}
4

3 回答 3

1

如果不再需要位图,最好调用 bitmap.recycle(),这样可以使系统更主动地回收本机内存。

因此 setCurrentImage(int idx) 可以更改为

private void setCurrentImage(int idx) {
    imageView.setImageBitmap(null);
    currentBitmap.recycle();
    currentBitmap = null;
    try {
        Bitmap tempBitmap = BitmapFactory.decodeStream(getAssets().open(imguri[idx]));
        currentBitmap = Bitmap.createScaledBitmap(tempBitmap, 800, 480, true);
        tempBitmap.recycle();
        imageView.setImageBitmap(currentBitmap);
    } catch (IOException e) {
        Log.d(LOG_TAG, "No se pudo abrir el recurso" + imguri[0]);
        imageView.setImageBitmap(mDefaultBitmap);
    }
}
于 2012-12-28T16:57:26.140 回答
0

Use ListView for this purpose .

Use the link : http://www.vogella.com/articles/AndroidListView/article.html

于 2012-12-28T16:51:09.807 回答
0

好吧,我不知道当您以这种方式多次更改 ImageView 的位图时会产生什么样的效果。但我认为您应该使用支持库附带的 ViewPager。这样,您的实现会更快,因为它会自动加载下一个和上一个视图,并在不再需要时将其删除。这对用户来说会更好,因为他/她可以滑动图像。

为了让它更好,你可以使用这个库,它扩展了 ViewPager 的功能:

http://viewpagerindicator.com/

于 2012-12-28T16:53:00.850 回答