Вкладки Android - навигация между вкладками, вызывающая утечку памяти - PullRequest
2 голосов
/ 07 июня 2011

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

В простом приложении с 3 вкладками, где каждая вкладка имеет отдельную функцию, у меня есть кнопка на вкладке Tab3, которая отправляет пользователя обратно на вкладку Tab1 вместе с messageId. Операция, связанная с Tab1, улавливает эту дополнительную информацию и отображает сообщение, если оно присутствует. Ниже приведена информация о кнопке в Tab3:

public void onClick(View arg0) {
    Intent notificationIntent = new Intent(getApplicationContext(), TabContainerActivity.class);
    notificationIntent.setAction("com.test.notify.MESSAGE");
    notificationIntent.putExtra(MessageBean.MESSAGE_ID, messageId);
    startActivity(notificationIntent);
}

Контейнер вкладок TabContainerActivity.class реплицирует Extras на дочерние действия. Он также имеет логику для захвата Action, отправленного с намерением, и, если он найден, он используется, чтобы решить, какую вкладку установить в качестве текущей:

if(getIntent().getExtras() != null ) intent.putExtras(getIntent().getExtras());
if(getIntent().getAction().equalsIgnoreCase("com.test.notify.MESSAGE"))
{       
    tabHost.setCurrentTab(0);
}
else if(getIntent().getAction().equalsIgnoreCase("com.test.notify.SETTINGS"))
{
    tabHost.setCurrentTab(1);
}
...etc...

С помощью приведенного выше кода вы можете перемещаться между вкладками в обычном режиме, вы также можете нажать на сообщение в Tab3 и полностью отобразить его в Tab1 - Отлично! В будущем код можно будет легко изменить, чтобы другие приложения могли передавать MessageID на первое действие вкладок, Wonderfu!

Однако - это поведение теперь налицо:

  1. Нажмите Tab3,
  2. Выберите сообщение [[Отправлено новое намерение, открывающее новое TabContainerActivity действие]]
  3. Внутри этого действия нажмите Tab3,
  4. Выберите другое сообщение [[Новое намерение отправлено, открывая ДРУГОЙ новый TabContainerActivity деятельность]]
  5. (повторите 3 и 4 и 5)

Надеюсь, вы видите проблему! Вы можете пройти 1030 * через каждое из этих действий, убрав их из стека, но из-за рекурсивного характера проблемы вы можете продолжить навигацию, создавая новое действие с каждым проходом, вплоть до исключений OutOfMemory.

Итак, к вопросу;

Я хочу, чтобы функциональность, содержащаяся в действии Tab1, запускалась всякий раз, когда вкладка становится видимой (в данном случае загрузка сообщения), поэтому я бы хотела оставить ее как действие в отдельности. Сказав это, при переходе к я хочу, чтобы это была единственная активность вкладок, которая находится в стеке. Как мне этого добиться?

Буду признателен за любую помощь и обсуждение!

1 Ответ

1 голос
/ 07 июня 2011

Используйте это

public void onClick(View arg0) {
    Intent notificationIntent = new Intent(NotifyService.getInstance(), TabContainerActivity.class);
    notificationIntent.setAction("com.test.notify.MESSAGE");
    notificationIntent.putExtra(MessageBean.MESSAGE_ID, messageId);
    notificationIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(notificationIntent);
}

Я думаю, что просто использование .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) для намерения снова начать задание поможет вам получить желаемый результат.

...