У меня есть AsyncTask, который мне нужно перезапустить, если пользователь выполняет настройки, такие как Switch Color.MemoryLeak trough onConfigurationChanged()
Когда он сделал так, я начинаю AsyncTask так:
myWorkerClass.clearMemory();
myWorkerClass = new WorkerClass(getApplicationContext(), gv, searchbar, width, scaleButtonText);
myWorkerClass.execute();
В AsyncTask
я добавить onTextChangeListener
к моему EditText (который вызывает MemoryLeak позже!).
Для предотвращения MemoryLeaks у меня есть метод в моей AsyncTask который удаляет onTextChangedListener
:
public void clearMemory() {
searchbar.removeTextChangedListener(myTextWatcher);
}
Все хорошо, за исключением, когда я повернуть мое устройство работает. Когда я повернуть мое устройство я сделать это только в onConfigurationChanged
:
myWorkerClass.clearMemory();
myWorkerClass = new WorkerClass(getApplicationContext(), gv, searchbar, width, scaleButtonText);
myWorkerClass.execute();
Как вы можете видеть, я сделать то же самое, как если изменяется пользователь цвет. Но на вращающемся устройстве я течет Память, при переключении Цвет я не!
Это после включения цвета:
Это после поворота экрана несколько раз (помните, я делать точно так же, как и при переключении цвета:
Это мои подозреваемые в утечке из кучи кучи:
Это мое доминатором дерево:
Почему я знаю onTextChangeListener это проблема?
Потому что, если я комментирую добавление onTextChangedListener в свой EditText, все работает нормально. Нет утечек памяти.
Мой вопрос:
Почему утечка памяти Rotation Изменение и изменение цвета не когда я начать AsyncTask точно так же, как и делать точные те же вещи в AsyncTask?
Я искал немного: http://developer.android.com/guide/topics/resources/runtime-changes.html
Но я не могу понять, если это моя проблема. Поворот должен делать что-то другое, например, создавать новое действие из-за этого, создавая новую ссылку на мой edittext. И из-за этого он не может удалить старый onTextChangeListener
.
Пожалуйста, поймите.Я не хочу публиковать весь свой код. Но я думаю, что это не обязательно в этом случае.
Я ценю любую помощь.
Заранее спасибо
Спасибо за ваш ответ. Да, я помещаю ссылку на мою панель поиска (из моей деятельности) в AsyncTask (что не является внутренним классом моей деятельности). Поэтому я никогда не работал с WeakReference, могу ли вы дать мне быстрое решение, как реализовать это? Я знаю, что это непросто из-за того, что я не предоставлял никакого кода. Но, может быть, мы сможем сделать это? В любом случае, если он GCing мой поиск, то мой 'clearMemory()' должен быть бесполезным право? Потому что, собирая панель поиска, он также собирает 'onTextChangeListener', правильно? – MMike
@MMike Я добавил короткую псевдокодную презентацию использования WeakReference. Также в действии.onCreate вы можете обновить ссылку searchBar внутри вашей AsyncTask, но вам нужно будет каким-то образом ссылаться на вашу асинтезу, используя (устаревший) onRetainNonConfigurationInstance или новый aproach с сохраненными фрагментами. – marcinj
Хм это слишком большой для меня, я попробую с WeakReference и поставлю WeakReference в AsyncTask и проверьте, не является ли оно нулевым. Если это null, мне нужно сделать новую ссылку на строку поиска справа и поместить ее снова в WeakReference, если это необходимо? – MMike