Где утечка памяти? - PullRequest
       0

Где утечка памяти?

0 голосов
/ 18 января 2011

мои дорогие друзья.Не могли бы вы помочь мне выяснить, где у меня утечка памяти в моем приложении.

Есть два действия.

В первом упражнении у меня получился довольно большой статический ArrayList, состоящий из растровых изображений идругая необходимая информация.Я сделал его статическим, потому что мне нужно взять его из другого действия, а загрузка занимает много времени.

В другом упражнении у меня также есть одно статическое поле, которое используется в качестве ключа для получения данных, которые представлены вНамерение от предыдущего действия.

Если я пытаюсь запустить одно действие от другого и вернуться назад несколько раз, я выключаю ВМ.

Чтобы быть более ясным, вот фрагмент моегокод:

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 Ответ

1 голос
/ 19 января 2011

Я бы предположил, что потенциально точка утечки памяти находится в FilmInfo члене класса:

private LinearLayout mWall;

Макет имеет ссылку на Activity, которая каждый раз изменяется.Поэтому, чтобы избежать ссылки на мертвую активность, просто используйте в FilmInfo class

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

В любом случае, рецепт прост - старайтесь избегать хранения объектов, которые могут содержать ссылки на объекты Activity / Context.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...