Android内存泄漏解决方案

时间:2011-04-28 08:38:18

标签: android memory-leaks

我遇到内存泄漏问题。当我展示一个活动时,每件事都有效。当我按下并尝试重新加载活动时,我得到一个outOfMemoryException。

因此,从我读过的文档中我可以得出结论,在此活动中并非所有引用都被删除,因此垃圾收集器不会回收活动(因为gc收集了带有活动引用的活动)。

例如,下面的代码可能导致内存泄漏(假设有少量可用内存)?因为我初始化了gestureDetector,但我从来没有取消初始化:

public class FotoGallery    extends Activity    {
    private GestureDetector gestureDetector;
 public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);


        gestureDetector = new GestureDetector(new MyGestureDetector());



}
    }

编辑:当我在imageView中设置图像时,我已经遇到了这个问题。

public class FotoGallery    extends Activity    {
    private GestureDetector gestureDetector;
    private String path = "/mnt/sdcard/DCIM/img001.jpg";
private Bitmap currentBitmap;


 public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);


        gestureDetector = new GestureDetector(new MyGestureDetector());
        setImage(path);


}

private static final int SWIPE_MIN_DISTANCE = 30;
private static final int SWIPE_MAX_OFF_PATH = 250;
private static final int SWIPE_THRESHOLD_VELOCITY = 200;

class MyGestureDetector extends SimpleOnGestureListener {
    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
            float velocityY) {
        try {
            if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH)
                return false;
            // right to left swipe
            if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE
                    && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                //rightFling detected
            } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE
                    && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                //leftFling detected
            }
        } catch (Exception e) {
            // nothing
        }
        return false;
    }

}


private void setImage(String path) {
    if (currentBitmap != null) {
        currentBitmap.recycle();
    }
    final ImageView imageView = (ImageView) findViewById(R.id.imageview);
    currentBitmap = BitmapFactory.decodeFile(path);
    imageView.setImageBitmap(currentBitmap);
}
    }


Now my final question is how can you uninitialise all the variables at the right time? Do you specifically need to listen for when a user pr

回来然后把所有变量都归零?

2 个答案:

答案 0 :(得分:2)

您的应用程序(或者更确切地说,此活动)实际上做了什么?我不知道单独的代码会如何造成太大的伤害,但我可能是错的。

我在内存泄漏方面遇到了一些麻烦。记忆跟踪,我后来修复,这些文章给了我一些很好的见解:

  

http://android-developers.blogspot.co.uk/2009/01/avoiding-memory-leaks.html

     

http://android-developers.blogspot.co.uk/2009/02/track-memory-allocations.html

可能需要更多信息来帮助您。您的活动名为FotoGallery,因此我将快速猜测并说您的问题在于您加载的图片以及诸如此类的东西。对于有限的内存和放大器,有很多关于SO的问题。加载图片。

答案 1 :(得分:0)

我通过添加System.gc()解决了这个问题;在setImage方法的开头(没有任何if或类似的东西)。