Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
yura91
1 / 25 / 2
Регистрация: 23.10.2013
Сообщений: 2,323
#1

Handler при пересоздании активити

07.07.2016, 16:06. Просмотров 563. Ответов 25
Метки нет (Все метки)

У меня есть поток Thread, который запускается во фрагменте и получает ссылку на изображение с сервера(парсит JSON выделяет ссылку). И Handler который связан с UI потоком, запускает Runnable в UI потоке, в котором через Glide загружает изображение в Layout. Вопрос в следующем: фрагмент может пересоздаваться не только при поворотах, а и при смене языка и доступности клавиатуры и др ситуации. И в итоге после этого пересоздания с Handlerом начнутся проблемы. Что нужно делать с Handlerом при пересоздании активити? Как учесть этот момент? Может в onDestroy() как то можно его отменять можете рассказать решение??
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.07.2016, 16:06
Ответы с готовыми решениями:

Сохранение данных при пересоздании активити
Добрый день, может кто-то сталкивался: имеются данные, которые я хочу добавить...

Сохранить состояние презентера при пересоздании (повороте) активити
Вот у презентера можно реализовать метод onDetach() в котором он обнуляет...

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

Утечка памяти при использовании Handler
Добрый день, многоуважаемые форумчане :). Прошу помощи в решении проблемы. ...

На телефоне highscreen 3 на всех активити происходит быстрый самовозврат к главной активити
Сделал меню в виде ListView. При клике на меню запускаются активити. На...

25
yura91
1 / 25 / 2
Регистрация: 23.10.2013
Сообщений: 2,323
10.07.2016, 19:56  [ТС] #21
через Glide
Java
1
2
3
4
5
6
7
8
9
Glide.with(context).load(image).asBitmap().into(new SimpleTarget<Bitmap>(100, 100) {
                                @Override
                                public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
                                    Drawable drawable = new BitmapDrawable(resource);
                                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                                        scrollview.setBackground(drawable);
                                    }
                                }
                            });
Но проблема в другом в onDestroy делаю
Java
1
2
3
4
5
6
7
8
@Override
    protected void onDestroy() {
        h.removeCallbacksAndMessages(null);
        super.onDestroy();
 
        Log.d("Func", "MainActivity: onDestroy()");
 
    }
И Handler все равно обраается к несуществующим элементам как исправить это?

Добавлено через 41 минуту
Java
1
2
3
4
public void changeFragmentTextView1(String s) {
        Fragment frag = getFragmentManager().findFragmentById(R.id.fragment1);
        ((TextView) frag.getView().findViewById(R.id.textView)).setText(s);
    }
Код который обращается к TextView во фрагменте который находится в активити. Эта функция вызывается в Runnable Handleraи из другого потока и приложение падает как исправить это?
0
vxg
Модератор
3247 / 2048 / 322
Регистрация: 13.01.2012
Сообщений: 7,926
10.07.2016, 20:09 #22
yura91, если glide загружает изображение и при завершении загрузки даёт вам об этом знать отдавая bitmap то что мешает иметь static поле у application которому вы бы присвоили этот bitmap и из которого в oncreate или в ином месте вы бы забирали его для ui? Кроме того имея bitmap вы можете сбросить его на диск и при запуске программы пользоваться уже загруженными данными если их обновление не требуется (хотя может этим занят glide я просто с ним не работал)
0
yura91
1 / 25 / 2
Регистрация: 23.10.2013
Сообщений: 2,323
10.07.2016, 20:29  [ТС] #23
Glide кэширует изображения. Ну просто проблема то в том что Hanler обращается к несуществующему TextView во фрагменте при повороте как с этим быть?

Добавлено через 44 секунды
Приложение от этого падает с NullPointerException если не запрещать пересоздание активити при смене ориентации.

Добавлено через 1 минуту
то есть он отдает результат в несуществующий фрагмент

Добавлено через 6 минут
То есть бывает такое что активити пересоздалось а Handler обращается к старому обьекту которого не существует и как эту проблему решать?
0
vxg
Модератор
3247 / 2048 / 322
Регистрация: 13.01.2012
Сообщений: 7,926
10.07.2016, 20:36 #24
yura91, хандл не может обратится к мертвому Активити если вы сами к этому руку не приложили - система не может убить Активити если ссылка на неё есть у хандла - если будет пересоздание то хандл будет работать с дохлой Активити но это будет легально - краша быть не должно просто вы не увидите результата его работы так как Активити дохлая и на экране не она
0
yura91
1 / 25 / 2
Регистрация: 23.10.2013
Сообщений: 2,323
10.07.2016, 22:20  [ТС] #25
А через sendMassage() нужно работать с Handlerom да? А смотрите если я сделал сетевой запрос в потоке распарсил JSON и хочу вывести результат в TextView, то как мне из потока в handleMassege() передать String например для обработки, ну чтобы вывести его на экран?

Добавлено через 45 минут
Через Handler в UI можно как нибудь объект String например передать? Как это можно сделать?
0
vxg
Модератор
3247 / 2048 / 322
Регистрация: 13.01.2012
Сообщений: 7,926
10.07.2016, 22:33 #26
yura91, лично я использую хандл как описал и в этом коде он имеет доступ к активити. Иного метода для себя не открыл но видел людей которые знают как это сделать. Помню лишь магическое слово обсервер

Добавлено через 2 минуты
Заполнить строки данными из отдельного класса
0
10.07.2016, 22:33
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.07.2016, 22:33

Как вызвать метод в активити классе из обычного не активити класса?
Есть активити в котором вводятся логин и пароль. При нажатии кнопки &quot;войти&quot; в...

Отображение активити поверх другого активити
Ребят подскажите пожалуйста как такое сделать. Есть активити с картой, по...

Вызов новой активити не из класса активити
Есть 4 класса: 1) WelcomeActivity; 2) MainActivity; 3) PopUpActivity; 4)...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
26
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru