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

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

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

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

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

У меня есть поток Thread, который запускается во фрагменте и получает ссылку на изображение с сервера(парсит JSON выделяет ссылку). И Handler который связан с UI потоком, запускает Runnable в UI потоке, в котором через Glide загружает изображение в Layout. Вопрос в следующем: фрагмент может пересоздаваться не только при поворотах, а и при смене языка и доступности клавиатуры и др ситуации. И в итоге после этого пересоздания с Handlerом начнутся проблемы. Что нужно делать с Handlerом при пересоздании активити? Как учесть этот момент? Может в onDestroy() как то можно его отменять можете рассказать решение??
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
Модератор
3155 / 1957 / 218
Регистрация: 13.01.2012
Сообщений: 7,484
09.07.2016, 13:20 #16
yura91, я в ADT сижу он сам все форматирует без кнопок фрагмент сейчас не могу кинуть позже
yura91
30 / 28 / 2
Регистрация: 23.10.2013
Сообщений: 2,248
09.07.2016, 14:04  [ТС] #17
И еще такой вопрос смотри у меня приложение делает запрос на Opeweathermap и парсит JSON, загружает картинку в фон. И когда я начинаю сильно вертеть экран(делаю частые повороты в процессе загрузки изображения), то приложение падает с
07-09 13:52:59.008 13353-13703/com.uifragmentsexample.user.myuifragments W/System.err: org.json.JSONException: No value for 3h
07-09 13:52:59.008 13353-13703/com.uifragmentsexample.user.myuifragments W/System.err: at org.json.JSONObject.get(JSONObject.java:354)
07-09 13:52:59.008 13353-13703/com.uifragmentsexample.user.myuifragments W/System.err: at org.json.JSONObject.getString(JSONObject.java:510)
07-09 13:52:59.008 13353-13703/com.uifragmentsexample.user.myuifragments W/System.err: at com.uifragmentsexample.user.myuifragments.OpenWeather.jsonHelperGetString(OpenWeather.java:223)
07-09 13:52:59.008 13353-13703/com.uifragmentsexample.user.myuifragments W/System.err: at com.uifragmentsexample.user.myuifragments.OpenWeather.ParseJSONForecast(OpenWeather.java:116)
07-09 13:52:59.009 13353-13703/com.uifragmentsexample.user.myuifragments W/System.err: at com.uifragmentsexample.user.myuifragments.MainActivity$4$1.run(MainActivity.java:337)
07-09 13:52:59.009 13353-13703/com.uifragmentsexample.user.myuifragments W/System.err: at java.lang.Thread.run(Thread.java:838)
вот такой ошибкой. Как можно исправить эту проблему? Есть какая нибудь защита от этого?

Добавлено через 5 минут
Java
1
2
3
4
5
6
7
8
9
private String jsonHelperGetString(JSONObject obj, String k) {
        String v = null;
        if (obj != null) {
            try {
                v = obj.getString(k);
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
Вот метод парсинга строки

Добавлено через 1 минуту
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
String ParseJSONForecast(String json) {
        String jsonResult = "";
        try {
            JSONObject JsonObject = new JSONObject(json);
            JSONObject city = jsonHelperGetJSONObject(JsonObject, "city");
            if (city != null) {
 
                String cod = jsonHelperGetString(JsonObject, "cod");
                Log.d("Func", cod);
                if (cod != null) {
                    if (cod.equals("200")) {
 
 
                        jsonResult += jsonHelperGetString(city, "name") + "\n";
                        jsonResult += jsonHelperGetString(city, "country") + "\n";
                        JSONObject coord = jsonHelperGetJSONObject(city, "coord");
                        if (coord != null) {
                            String lon = jsonHelperGetString(coord, "lon");
                            String lat = jsonHelperGetString(coord, "lat");
                            jsonResult += "lon: " + lon + "\n";
                            jsonResult += "lat: " + lat + "\n";
 
                        }
                        jsonResult += "\n";
                        Log.d("Func", jsonResult);
 
                        JSONArray list = jsonHelperGetJSONArray(JsonObject, "list");
 
                        if (list != null) {
                            Log.d("Func", "Here" + list.length());
                            for (int i = 0; i < list.length(); i++) {
                                JSONObject thisWeather = list.getJSONObject(i);
                                JSONObject main = jsonHelperGetJSONObject(thisWeather, "main");
 
                                if (main != null) {
                                    jsonResult += "temp: " + jsonHelperGetString(main, "temp") + "\n";
                                    jsonResult += "pressure: " + jsonHelperGetString(main, "pressure") + "\n";
                                    jsonResult += "humidity: " + jsonHelperGetString(main, "humidity") + "\n";
                                    jsonResult += "temp_min: " + jsonHelperGetString(main, "temp_min") + "\n";
                                    jsonResult += "temp_max: " + jsonHelperGetString(main, "temp_max") + "\n";
                                    jsonResult += "sea_level: " + jsonHelperGetString(main, "sea_level") + "\n";
                                    jsonResult += "grnd_level: " + jsonHelperGetString(main, "grnd_level") + "\n";
                                    jsonResult += "temp_kf: " + jsonHelperGetString(main, "temp_kf") + "\n";
                                    jsonResult += "\n";
 
                                }
                                JSONArray weather = jsonHelperGetJSONArray(thisWeather, "weather");
 
                                if (weather != null) {
                                    Log.d("Func", "Here" + "weather");
                                    for (int j = 0; j < weather.length(); j++) {
                                        JSONObject thisWeather1 = weather.getJSONObject(j);
                                        jsonResult += "weather " + ":\n";
                                        jsonResult += "id: " + jsonHelperGetString(thisWeather1, "id") + "\n";
 
                                        jsonResult += "main: " + jsonHelperGetString(thisWeather1, "main") + "\n";
                                        jsonResult += "description: " + jsonHelperGetString(thisWeather1, "description") + "\n";
                                        jsonResult += "\n";
                                    }
                                }
 
                                JSONObject clouds = jsonHelperGetJSONObject(thisWeather, "clouds");
                                String all = jsonHelperGetString(clouds, "all");
                                jsonResult += "clouds: " + all + "\n";
                                Log.d("Func", all);
                                JSONObject wind = jsonHelperGetJSONObject(thisWeather, "wind");
                                String speed = jsonHelperGetString(wind, "speed");
                                jsonResult += "speed: " + speed + "\n";
                                Log.d("Func", speed);
                                String deg = jsonHelperGetString(wind, "deg");
                                jsonResult += "deg:" + deg + "\n";
                                Log.d("Func", deg);
                                JSONObject rain = jsonHelperGetJSONObject(thisWeather, "rain");
                                String h = "3h:" + jsonHelperGetString(rain, "3h");
                                jsonResult += h + "\n";
                                JSONObject sys = jsonHelperGetJSONObject(thisWeather, "sys");
                                String pod = jsonHelperGetString(sys, "pod");
                                jsonResult += "pod:" + pod + "\n";
                                Log.d("Func", pod);
                                String dt_txt = jsonHelperGetString(thisWeather, "dt_txt");
                                Log.d("Func", dt_txt);
                                jsonResult += "dt_txt:" + dt_txt + "\n";
                            }
                        }
                    }
                }
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
        Log.d("Func", jsonResult);
        return jsonResult;
    }
Добавлено через 28 секунд
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 private JSONObject jsonHelperGetJSONObject(JSONObject obj, String k) {
        JSONObject o = null;
        if (obj != null) {
            try {
                o = obj.getJSONObject(k);
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
        return o;
    }
 
    private JSONArray jsonHelperGetJSONArray(JSONObject obj, String k) {
        JSONArray a = null;
        if (obj != null) {
            try {
                a = obj.getJSONArray(k);
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
        return a;
    }
}
Добавлено через 50 секунд
Как можно исправить этот парсинг, чтобы предотвратить JSONException?
vxg
Модератор
3155 / 1957 / 218
Регистрация: 13.01.2012
Сообщений: 7,484
09.07.2016, 22:55 #18
yura91, эээ.... так вы картинку не загружаете в смысле слова "загрузить" = скачать по сети, а просто присваиваете какие-то судя по тематике облачка из уже имеющихся в ресурсах?
yura91
30 / 28 / 2
Регистрация: 23.10.2013
Сообщений: 2,248
10.07.2016, 15:33  [ТС] #19
Не там по сети подружается но эту проблему я уже решил. А можете скинуть фрагмент как можно хранить Bitmap в Application и доставать его от туда при необходимости из разных компонентов приложения?
vxg
Модератор
3155 / 1957 / 218
Регистрация: 13.01.2012
Сообщений: 7,484
10.07.2016, 18:44 #20
yura91, а может вы мне немного поможете показав как вы загружаете изображение ? Что то мне подсказывает что если в ваших руках после загрузки имеется байтовое представление изображения то вы можете его и хранить и сохранить
yura91
30 / 28 / 2
Регистрация: 23.10.2013
Сообщений: 2,248
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и из другого потока и приложение падает как исправить это?
vxg
Модератор
3155 / 1957 / 218
Регистрация: 13.01.2012
Сообщений: 7,484
10.07.2016, 20:09 #22
yura91, если glide загружает изображение и при завершении загрузки даёт вам об этом знать отдавая bitmap то что мешает иметь static поле у application которому вы бы присвоили этот bitmap и из которого в oncreate или в ином месте вы бы забирали его для ui? Кроме того имея bitmap вы можете сбросить его на диск и при запуске программы пользоваться уже загруженными данными если их обновление не требуется (хотя может этим занят glide я просто с ним не работал)
yura91
30 / 28 / 2
Регистрация: 23.10.2013
Сообщений: 2,248
10.07.2016, 20:29  [ТС] #23
Glide кэширует изображения. Ну просто проблема то в том что Hanler обращается к несуществующему TextView во фрагменте при повороте как с этим быть?

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

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

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

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

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

Изменение параметров активити из другого активити - Программирование 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
Объявления
10.07.2016, 22:33
Ответ Создать тему
Опции темы

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