Утечка памяти Android?Растровое изображение превышает ошибку бюджета виртуальной машины с MapView - PullRequest
2 голосов
/ 29 февраля 2012

Я написал приложение, которое создает действие карты.Оттуда пользователь может переключиться на меню и вернуться к активности на карте.Примерно после 10 из этих циклов возникает следующая ошибка:

02-28 21:35:54.780: E/AndroidRuntime(23502): java.lang.OutOfMemoryError: bitmap size exceeds VM budget

Я пробовал решение unbind drawables, предложенное здесь http://www.alonsoruibal.com/bitmap-size-exceeds-vm-budget/ и в различных других потоках, но это не помогло.

Единственное, что помогает, это закрытие действия карты вручную с помощью finish (), но это вызывает неестественное поведение при навигации.

Вот мой код:

Класс MapActivity

public class TestMapsForgeActivity extends MapActivity {

View mapView;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mapView = new MapView(this);
}

@Override
public boolean onCreateOptionsMenu(android.view.Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.map_menu, menu);
    return true;
};

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    startActivity(new Intent(getApplicationContext(), MenuActivity.class));
    return true;
}
}

Класс MenuActivity

public class MenuActivity extends Activity {
@Override
public boolean onCreateOptionsMenu(android.view.Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.main_menu, menu);
    return true;
};

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    startActivity(new Intent(getApplicationContext(), TestMapsForgeActivity.class));
    return true;

}

}

Что я не понимаю, так это то, что сборщик мусора, по-видимому, не уничтожает MapActivity должным образом, пока я не закрою его с помощью finish ().Но не должен ли Android вызывать finish () самостоятельно, как только приложению понадобится больше памяти?

У кого-нибудь есть мысли по этому поводу?

Заранее спасибо!

1 Ответ

2 голосов
/ 29 февраля 2012

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

Попробуйте это:

    Intent i = new Intent(getApplicationContext(), TestMapsForgeActivity.class);
    i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(i);

Установка флага Intent CLEAR_TOP, завершит остальные предыдущие действия, подробнее здесь: http://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_CLEAR_TOP

...