开发者

Where is the memory leak?

my dear friends. Could you help me to figure out where do I have memory leak in my application.

There are two activities.

In first activity I'v got a rather big static ArrayList consists of bitmaps and another needed information. I made it static, because I need to take it from another activity, and It's loading takes to much time.

In another activity, I also have one static field, using as a key for getting data which present in an Intent from previous activity.

If I try to start one activity from another and go back several times, I get shutting down VM.

To be more clear, here is a snippet of my code:

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;
...
}

And this is another activity:

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);
    }


I would suggest that potentially memory-leak point is in FilmInfo class member:

private LinearLayout mWall;

Layout has reference to Activity, which each time changes. So to avoid keeping reference to dead Activity just use in FilmInfo class

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

Anyway recipe is simple - try to avoid keeping objects which might contain references to Activity/Context objects.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜