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

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

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

Вывод message - Android

15.07.2016, 22:21. Просмотров 223. Ответов 23
Метки нет (Все метки)

Java
1
2
3
4
5
6
7
8
Message msg = h.obtainMessage();
                    Bundle b = new Bundle();
                    b.putString("KEY1", ParseQuery);
                   // b.putString("KEY2", ParseQueryForeCast);
                    b.putString("KEY3", image);
                    msg.setData(b);
                    h.addto(msg);
                    h.sendMessage(msg);
так я отправляю сообщение через Handler, но когда я вывожу его в лог вот так
Java
1
Log.d("Func", "ADDTO" + msg.toString());
То в логи выводит
ADDTO{ what=0 when=-14h30m45s320ms target=Handler (com.activityexample.user.locationactivity.MyHandler) {412eccc8} }
вот это. А почему? почему оно не выводит то что я установил в Message через Bundle(ну тот нормальный текст)?? Где здесь мое сообщение?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.07.2016, 22:21     Вывод message
Посмотрите здесь:

Хранение Message[] Android
Java.lang.NoSuchFieldError: org.apache.http.message.BasicHeaderValueFormatter.INSTANCE Android
Android Как менять message AlertDialog в зависимости от progress SeekBar?

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OlegJV
 Аватар для OlegJV
101 / 101 / 29
Регистрация: 13.03.2016
Сообщений: 470
15.07.2016, 22:33     Вывод message #2
Если в холодильник в углу положить колбасу, а потом спросить что у нас в углу, ответ будет холодильник, а не колбаса. Bundle надо извлечь из msg. getData вроде, если не ошибаюсь...
yura91
28 / 26 / 2
Регистрация: 23.10.2013
Сообщений: 2,202
15.07.2016, 23:38  [ТС]     Вывод message #3
А если у меня есть поле private static Message messages; внутри класса MyHandler. А сам объект MyHandler определяется во фрагменте который пересоздается. То static поле должно же сохранять свое значение даже когда фрагмент пересоздастся, даже когда объект MyHandler будет уничтожен верно же?

Добавлено через 3 минуты
просто я в функции присваиваю значение этой статической переменной, но когда объект MyHandler уничтожается - это поле тоже опустошается почему - то?
OlegJV
 Аватар для OlegJV
101 / 101 / 29
Регистрация: 13.03.2016
Сообщений: 470
16.07.2016, 00:23     Вывод message #4
Если колбасу запретить есть, она будет static. Но если уничтожить холодильник, колбаса тоже уничтожится.
yura91
28 / 26 / 2
Регистрация: 23.10.2013
Сообщений: 2,202
16.07.2016, 01:06  [ТС]     Вывод message #5
Ну и как тогда решить эту проблему? Я так понимаю Bundle уничтожается при пересоздании. Как избежать этого уничтожения? Мне нужно сохранить переменную. подскажите пожалуйста?
OlegJV
 Аватар для OlegJV
101 / 101 / 29
Регистрация: 13.03.2016
Сообщений: 470
16.07.2016, 01:09     Вывод message #6
Маловато данных. Что там куда передаётся, что пересоздается, что уничтожается...
yura91
28 / 26 / 2
Регистрация: 23.10.2013
Сообщений: 2,202
16.07.2016, 01:36  [ТС]     Вывод message #7
Ну есть фрагмент он пересоздается. Есть Handler(вернее MyHandler который расширяет стандартный) он является полем этого фрагмента(глобальной переменной в нем) и по сему уничтожается при пересоздании вместе с фрагментом. Есть обработчик(интерфейс у которого есть метод doAction). Так вот фрагмент имплиментирует этот интерфейс и реализует doAction в котором устанавливает текст в TextView и загружает картинку в фон фрагмента. Обработчик устанавливается на Handler в onstart фрагмента и отменяется в onStop. Есть фоновый поток который делает сетевой запрос, как в onCreate() так и по нажатию кнопки во фрагменте. В ответ на этот запрос приходит JSON парсим его и выделяем ссылку на фоновое изображение и текст для TextView. В сеттере обработчика(котрый вызывается в onstart) мы должны проверить если есть сообщение для Handlerа вызываем метод handleMessages(). В handleMessages() проверяем на null обработчик. И если все ОК вызываем doAction. Вот поэтому мне и нужно сохранить где то в своем классе MyHandler последнее сообщение для Handler, чтобы после пересоздания его обработать вот. Но сообщение передается через Bundle. А как это можно сделать ? Или можно как то воспользоваться стандартным hasMessages() но дело в том что она тоже на вход параметр принимает код сообщения. И handleMessages чтобы вызвать надо на вход сообщение передать. Вот и думаю как все грамотно завершить здесь?

Добавлено через 1 минуту
Без пересоздания все работает отлично. Интересен вариант с пересозданием.

Добавлено через 1 минуту
Сообщения для Handlerа мы посылаем из потока естественно(это то что нужно уже на экране отобразить)
OlegJV
 Аватар для OlegJV
101 / 101 / 29
Регистрация: 13.03.2016
Сообщений: 470
16.07.2016, 01:37     Вывод message #8
Откуда приходит сообщение для handler и куда передаётся?
yura91
28 / 26 / 2
Регистрация: 23.10.2013
Сообщений: 2,202
16.07.2016, 01:41  [ТС]     Вывод message #9
А Bundle тоже уничтожается при пересоздании? Просто через Bundle и идет отправка сообщений из потока Handlerу

Добавлено через 30 секунд
Есть фоновый поток, который делает сетевой запрос

Добавлено через 15 секунд
И парсинг JSON в нем

Добавлено через 36 секунд
Вот результат этого всего мы передаем в Handler который во фрагменте, то есть в UI потоке

Добавлено через 25 секунд
через sendMessages

Добавлено через 1 минуту
То есть передаем чисто ссылку на изображение и текстовые данные, которые нужно только отобразить
OlegJV
 Аватар для OlegJV
101 / 101 / 29
Регистрация: 13.03.2016
Сообщений: 470
16.07.2016, 01:42     Вывод message #10
Как-то сумбурно все. Чего ради фрагмент пересоздается?
yura91
28 / 26 / 2
Регистрация: 23.10.2013
Сообщений: 2,202
16.07.2016, 01:44  [ТС]     Вывод message #11
Ну возможность разметку добавить для горизонтальной ориентации. Да и так он может пересоздаваться не только при поворотах. При поворотах то можно запретить пересоздание. А есть же и другие ситуации когда пересоздается активити и фрагмент.
OlegJV
 Аватар для OlegJV
101 / 101 / 29
Регистрация: 13.03.2016
Сообщений: 470
16.07.2016, 01:44     Вывод message #12
Нельзя вв Asynctask распарсить Json и кинуть Intent, а фрагмент пусть его ловит, будь он хоть 100500 раз пересозданный?
yura91
28 / 26 / 2
Регистрация: 23.10.2013
Сообщений: 2,202
16.07.2016, 01:47  [ТС]     Вывод message #13
Можно конечно сообщение достать из Bunndle методом getData перевести String и сделать это статик вот думаю

Добавлено через 1 минуту
Нельзя вв Asynctask распарсить Json и кинуть Intent, а фрагмент пусть его ловит, будь он хоть 100500 раз пересозданный?
Это как тогда во фрагменте ресивер нужен. И потом интент может быть пропущен из за пересоздания.

Добавлено через 34 секунды
Интент пойдет, а фрагмент пересоздастся.
OlegJV
 Аватар для OlegJV
101 / 101 / 29
Регистрация: 13.03.2016
Сообщений: 470
16.07.2016, 01:48     Вывод message #14
А в чем проблема ресивер сделать.
yura91
28 / 26 / 2
Регистрация: 23.10.2013
Сообщений: 2,202
16.07.2016, 01:51  [ТС]     Вывод message #15
то есть интент может пойти в тот момент когда не факт что фрагмент еще существует и поймает его. Эта вероятность тоже есть. Разве нет?

Добавлено через 36 секунд
А ресивер внутри фрагмента существует тоже.

Добавлено через 37 секунд
То есть в момент самого пересоздания может пойти интент а это не очень хорошо

Добавлено через 1 минуту
Можно либо в статике либо в аппликейшен, либо в SharedPreferences данные сохранять и после пересоздания от туда вытаскивать и подгружать. Тоже вариант?
OlegJV
 Аватар для OlegJV
101 / 101 / 29
Регистрация: 13.03.2016
Сообщений: 470
16.07.2016, 01:52     Вывод message #16
Сделай ресивер в Активити, данные будут там если фрагмента нету, а при создании в onCreate он их заберёт.
yura91
28 / 26 / 2
Регистрация: 23.10.2013
Сообщений: 2,202
16.07.2016, 01:54  [ТС]     Вывод message #17
Но активити же тоже пересоздается.

Добавлено через 28 секунд
можно конечно в манифесте ресивер прописать, так лучше будет?

Добавлено через 14 секунд
или локально создать в активити?
OlegJV
 Аватар для OlegJV
101 / 101 / 29
Регистрация: 13.03.2016
Сообщений: 470
16.07.2016, 01:55     Вывод message #18
Хотя мне кажется ты переоцениваешь момент пересоздания
yura91
28 / 26 / 2
Регистрация: 23.10.2013
Сообщений: 2,202
16.07.2016, 01:58  [ТС]     Вывод message #19
Да?

Добавлено через 15 секунд
Почему?

Добавлено через 40 секунд
просто handler при пересоздании обращается к нулевым элементам вот

Добавлено через 1 минуту
Поэтому думаю в handler на нуль их проверять если еще нулевые элементы ui фрагмента то не обращаться к ним а в onStart данные из аппликейшен подтянуть и нормально все отобразить
OlegJV
 Аватар для OlegJV
101 / 101 / 29
Регистрация: 13.03.2016
Сообщений: 470
16.07.2016, 01:58     Вывод message #20
В крайнем случае сделать флаг в фрагменте и менять его при запросе и ответе, если интент не пришёл - сообщение об ошибке. Думаю это нечасто будет происходить
Yandex
Объявления
16.07.2016, 01:58     Вывод message
Ответ Создать тему
Опции темы

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