我正在创建自己的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);
}
}
}
答案 0 :(得分: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);
}
}
答案 1 :(得分:0)
为此目的使用ListView。
使用链接:http://www.vogella.com/articles/AndroidListView/article.html
答案 2 :(得分:0)
好吧,我不知道当你用这种方式改变很多次ImageView的位图时会有什么样的效果。但我认为你应该使用支持库附带的ViewPager。这样,您的实现将更快,因为它会自动加载下一个和上一个视图,并在不再需要时将其删除。对于用户来说它会更好,因为他/她可以滑动图像。
为了使其更好,您可以使用此库扩展ViewPager的功能: