内存泄漏在哪里?

时间:2011-01-18 14:07:28

标签: android memory-leaks

亲爱的朋友们。你能帮我弄清楚我的应用程序在哪里有内存泄漏。

有两项活动。

在第一个活动中,我得到了一个相当大的静态ArrayList,包括位图和另一个需要的信息。我把它设置为静态,因为我需要从另一个活动中获取它,并且它的加载需要很长时间。

在另一个活动中,我还有一个静态字段,用作获取前一个活动中Intent中存在的数据的键。

如果我尝试从另一个活动开始并多次返回,我会关闭VM。

更清楚的是,这是我的代码片段:

public class MoviesGallery extends Activity
{
...
private static ArrayList<Movie> films = new ArrayList<Movie>();
...
public void contextButtonsClickHandler(View v)
{
    switch(v.getId())
    {
        case R.id.play_button:
            Log.d("Context Button", "Play button has clicked");
            mContextButtonHasPressed = true;
            Intent filmData = new Intent(MoviesGallery.this, MovieInfo.class);
            filmData.putExtra(MovieInfo.mPOS,mPOSITION_OF_CLICKED_ITEM);
            startActivityForResult(filmData, 1);
            break;
...
}

这是另一项活动:

public class FilmInfo extends Activity
{
    public static String mPOS = "pos";
    private int mNumOfFilm = -1;
    private LinearLayout mWall;
...
protected void onCreate(Bundle savedInstanceState)
{
        Bundle extra = getIntent().getExtras();
    mNumOfFilm=extra.getInt(mPOS);
...      
        Drawable d = new BitmapDrawable(MoviesGallery.getMoviesArray().get(mNumOfFilm).getWall()));
    mWall = (LinearLayout) findViewById(R.id.Wall);
    mWall.setBackgroundDrawable(d);
    ...
        setResult(0);
    }

1 个答案:

答案 0 :(得分:1)

我建议可能的内存泄漏点在FilmInfo类成员中:

private LinearLayout mWall;

布局引用了Activity,每次都会更改。 因此,为避免引用死活动,请在FilmInfo

中使用
@Override
 public boolean onContextItemSelected(MenuItem item)
{
     //blah-blah
     mWall=null;
}

无论如何,配方很简单 - 尽量避免保留可能包含对Activity / Context对象的引用的对象。