InputMethodManager содержит ссылку на tabhost - утечка памяти - ошибка OOM - PullRequest
13 голосов
/ 24 апреля 2011

Вид иерархии выглядит следующим образом TabActivity -> ActivityGroups -> Activities.

Использование MAT Я обнаружил, что на TabWidget ссылается TabHost, чтоссылка на InputMethodManager, следовательно, TabWidget утечка.При последующем запуске приложения OutOfMemory выдается ошибка.

Аналогично на все мои действия также ссылается InputMethodManager.(После закрытия приложения все мои группы активности, действия, tabactivity, tabhost и tabwidget просочились !!)

Вкл. При правильном завершении приложения (нажатие клавиши назад) в logcat

* отображается следующее1019 * WARN / InputManagerService (99): запуск ввода для не сфокусированного клиента com.android.internal.view.IInputMethodClient$Stub$Proxy@44a87748 (uid = 10052 pid = 1463)

Как выполнитьудалить ссылку из InputMethodManager ...?

То, что я пробовал:

A.Называется этот метод onDestroy из моих TabActivity
1. myTabWidget.removeAllViews()
2. myTabWidger.invalidate()

Не повезло!


Ответы [ 3 ]

3 голосов
/ 14 апреля 2012

Я также столкнулся с этой проблемой и попытался каким-то образом избежать ее.Когда моя деятельность закончена, я пытаюсь разорвать соединение со службой менеджера метода ввода.Проверьте это:

class MyActivity extend Activity {
    @Override
    public void finish() {
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.windowDismissed(mContentView.getWindowToken());
        super.finish();
    }
}

Я не уверен, может ли это вообще исправить эту утечку памяти.На данный момент все работает нормально.Вы можете попробовать.

1 голос
/ 30 января 2013

Вы уверены, что утечка памяти реальна?У меня похожая ситуация, и хотя это выглядит как утечка памяти в MAT, я не могу получить два экземпляра TabActivity, чтобы появиться из-за InputMethodManager.Конечно, InputMethodManager, похоже, защищает TabActivity от сбора мусора.Но, если бы это была настоящая утечка памяти, я бы не смог увидеть два TabActivites, потом три, потом четыре?

(К вашему сведению, мне удалось увидеть две TabActivities в одной точке, но проблемаэто не InputMethodManager, это статическая ссылка в коде)

1 голос
/ 21 октября 2011

То, что я пытался: A. Вызвал этот метод onDestroy моей TabActivity 1.myTabWidget.removeAllViews () 2.myTabWidger.invalidate ()

Конечно, он не будет работать.Действия не являются представлениями ни в MVC / MVP / MVVM, ни в иерархии классов Android SDK.android.app.Activity не расширяет android.view.View

У моего коллеги была похожая проблема с утечками памяти - он объявил tabHost в TabActivity статическим способом (он хотел получить к нему доступ из другого действия, когдане был знаком с шаблоном Observer).Я думаю, вы сделали что-то похожее.

И, наконец, мой вопрос: почему вы ссылаетесь на действия в InputMethodManager (хотя я не понимаю, как: это конечный класс), а не InputMethodManager в действиях?Если вам нужна глобальная точка фокусировки для InputMethodManager, я могу посоветовать вам указать ссылку на класс приложения.Мы расширяем класс Application (например, HostApplication), в этом фасаде мы объявляем общие вещи (например, SharedPreferences).И в упражнениях мы пишем:

HostApplication application = (HostApplication) getApplication();

Затем мы получаем полезные общие сведения из этого.

...