Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Программирование Android

Войти
Регистрация
Восстановить пароль
 
 
yura91
30 / 28 / 2
Регистрация: 23.10.2013
Сообщений: 2,272
#1

Handler при пересоздании активити - Программирование Android

07.07.2016, 16:06. Просмотров 404. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Handler при пересоздании активити (Программирование Android):

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

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

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

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

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

Как вызвать метод в активити классе из обычного не активити класса? - Программирование Android
Есть активити в котором вводятся логин и пароль. При нажатии кнопки "войти" в отдельном классе "сокетсервер"(+в отдельном потоке)...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
vxg
Модератор
3162 / 1965 / 220
Регистрация: 13.01.2012
Сообщений: 7,523
08.07.2016, 08:46 #2
yura91, handler имеет ссылку на activity и поэтому она не может быть удалена даже при пересоздании - новая создастся, но и старая будет хоть и в мусорке, но недобитая. Я убиваю handler в onpause и пересоздаю в onresume
0
yura91
30 / 28 / 2
Регистрация: 23.10.2013
Сообщений: 2,272
08.07.2016, 14:04  [ТС] #3
То есть в onPause
Java
1
2
3
4
5
6
if (sThread.isAlive()){
 
sThread.setHandler(null);
 
 
}
а в onresume
Java
1
2
3
4
if (sThread.isAlive()){
sThread.setHandler(mHandler);
 
}
Так это делается да?
0
vxg
Модератор
3162 / 1965 / 220
Регистрация: 13.01.2012
Сообщений: 7,523
08.07.2016, 14:43 #4
yura91, у меня другой handler. у меня просто
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    private Handler handler;
 
    @Override
    protected void onResume () {
        super.onResume();
 
        handler = new Handler() { ... };
        handler.sendEmptyMessage(0);
    }
 
    @Override
    protected void onPause () {
        super.onPause();
 
        handler.removeMessages(0);
    }
0
yura91
30 / 28 / 2
Регистрация: 23.10.2013
Сообщений: 2,272
08.07.2016, 14:56  [ТС] #5
Но дело в том что Handler может запускать кусок кода Runnable в UI потоке. А handler.sendEmptyMessage(0); и handler.removeMessages(0); это же только для случая когда он просто отправляет сообщения в UI поток или если Runnable то тоже это работает?
0
vxg
Модератор
3162 / 1965 / 220
Регистрация: 13.01.2012
Сообщений: 7,523
08.07.2016, 15:00 #6
yura91, к сожалению не в курсе как вы одно с другим переплели. handler может то что может. у меня работа с ним организована как показано. ассоциацию handler с потоком я не за свою жизнь еще делал(
0
yura91
30 / 28 / 2
Регистрация: 23.10.2013
Сообщений: 2,272
08.07.2016, 16:15  [ТС] #7
А вот такая конструкция
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
Thread t = new Thread(new Runnable() {
                        public void run() {
 
                            OpenWeather weather = new OpenWeather();
 
                            weather.sendQuery(query);
 
                            h.sendEmptyMessage(1);
                            // пишем лог
 
 
                        }
                    });
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
 @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        editTextCityName = (EditText)findViewById(R.id.cityname);
 
        h = new Handler(){
            public void handleMessage(android.os.Message msg) {
 
          //Выполняем действия
            };
        };
Просто почему handler.sendEmptyMessage(0); у вас внутри Handlerа этот метод должен же вызываться внутри потока. Он же оттуда отправляет сообщение разве нет?
0
vxg
Модератор
3162 / 1965 / 220
Регистрация: 13.01.2012
Сообщений: 7,523
08.07.2016, 16:33 #8
yura91, сообщение может быть отправлено оттуда откуда виден объект. У меня первое сообщение посылается либо при возобновлении либо при неком событии. После этого handler шлёт сообщения сам себе с задержкой пока не отработает поток за которым он следит или его (часового) не снимут с дежурства при паузе
0
yura91
30 / 28 / 2
Регистрация: 23.10.2013
Сообщений: 2,272
08.07.2016, 17:38  [ТС] #9
Ну суть в том что в onPause нужно вызвать handler.removeMessages или removeCallbacks(если Runnable отправляем), чтобы все было удалено из очереди перед пересозданием активити так ведь, в этом суть?
0
vxg
Модератор
3162 / 1965 / 220
Регистрация: 13.01.2012
Сообщений: 7,523
08.07.2016, 18:20 #10
yura91, суть в том чтобы удалить сообщения из очереди - нет сообщений = нет ссылок на активити и она сможет спокойно умереть если что

Добавлено через 3 минуты
Кроме того если этого не делать хандлер обратится к мертвой активити если её пересоздало
0
yura91
30 / 28 / 2
Регистрация: 23.10.2013
Сообщений: 2,272
09.07.2016, 11:10  [ТС] #11
У меня еще такой вопрос. Вот у меня идет как: создается активити в методе onCreate() я создаю поток, в потоке делаю сетевой запрос, получаю JSON, выделяю ссылку на картинку. Handler у меня создается внутри onCreate(), я запускаю его Runnable из потока и в нем загружаю в фон активити эту картинку через Glide. Также есть кнопка по ее нажатию пользователь может загрузить другую картинку в фон, но когда идет пересоздание активити то в фон загружается опять самая первая картинка. А как можно переделать код чтобы загружалась при пересоздании не самая первая картинка, а картинка которую пользователь загрузил после нажатия кнопки? Как грамотно построить приложение?
0
vxg
Модератор
3162 / 1965 / 220
Регистрация: 13.01.2012
Сообщений: 7,523
09.07.2016, 11:16 #12
yura91, очевидно надо где-то хранить текущую картину. Может в статике приложения или даже на диске если нет желания грузить её при запуске
0
yura91
30 / 28 / 2
Регистрация: 23.10.2013
Сообщений: 2,272
09.07.2016, 12:36  [ТС] #13
а в статике как ее можно хранить? Просто статическую переменную создать которая содержит ссылку на картину да? и в Glide эту сохраненную ссылку просто передавать, можно так?
0
vxg
Модератор
3162 / 1965 / 220
Регистрация: 13.01.2012
Сообщений: 7,523
09.07.2016, 12:40 #14
yura91, в статике именно приложения а не Активити можно хранить битмап к примеру и присваивать его в oncreate элементу ui
0
yura91
30 / 28 / 2
Регистрация: 23.10.2013
Сообщений: 2,272
09.07.2016, 13:07  [ТС] #15
А можно фрагмент кода небольшой на счет Bitmap? И еще в Android Studio есть горячая клавиша для автоформатирования кода. Так вот если делать это автоформатирование, то код форматируется в соответствии со стандартами кода Google верно?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.07.2016, 13:07
Привет! Вот еще темы с ответами:

Изменение параметров активити из другого активити - Программирование Android
Как сделать так чтобы из первого активити поменять final ImageView img=(ImageView)findViewById(R.id.image1); ...

Вызов новой активити не из класса активити - Программирование Android
Есть 4 класса: 1) WelcomeActivity; 2) MainActivity; 3) PopUpActivity; 4) Client. Программа работает с сервером и получает...

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

Ошибка при при смене активити - Программирование Android
Была проблема с проигрыванием музыки при сворачивании приложения, я решил ее методом ниже @Override protected void onStop() ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
09.07.2016, 13:07
Ответ Создать тему
Опции темы

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