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

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

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

Запретить смену ориентации экрана пока идет загрузка - Программирование Android

09.07.2016, 20:26. Просмотров 311. Ответов 15
Метки нет (Все метки)

У меня есть такой код, где активити создается из двух фрагментов и потом запускает поток в котором идет сетевой запрос. В ответ приходит JSON я выделяю информацию и загружаю ее в TextView во фрагменты и в фон картинку(через Handler), но проблема в том, что если пользователь повернет экран а картинка еще не загрузилась - сетевой запрос не отработал то приложение падает с
07-09 20:12:58.256 16645-16859/com.uifragmentsexample.user.myuifragments W/System.err: org.json.JSONException: No value for 3h
07-09 20:12:58.258 16645-16859/com.uifragmentsexample.user.myuifragments W/System.err: at org.json.JSONObject.get(JSONObject.java:354)
07-09 20:12:58.260 16645-16859/com.uifragmentsexample.user.myuifragments W/System.err: at org.json.JSONObject.getString(JSONObject.java:510)
Как быть как исправить ошибку? Вот функция парсинга JSON
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;
    }
Добавлено через 55 секунд
Можно ли как то на время сетевого запроса(загрузки информации во фрагменты) запретить пользователю поворачивать экран?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.07.2016, 20:26     Запретить смену ориентации экрана пока идет загрузка
Посмотрите здесь:
Android Запретить смену ориентации экрана
Android Как запретить смену ориентации при вызове DialogFragment?
Смена ориентации экрана Android
Изменение ориентации экрана Android
Событие смены ориентации экрана Android
Android Смена ориентации экрана перезапускает приложение
Android Поведение после смены ориентации экрана
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
yura91
29 / 27 / 2
Регистрация: 23.10.2013
Сообщений: 2,238
09.07.2016, 21:08  [ТС]     Запретить смену ориентации экрана пока идет загрузка #2
http://api.openweathermap.org/data/2...e34d8d8dd16537 - ссылка на сам JSON

Добавлено через 1 минуту
А на время пока загрузка идет можно как то вращение экрана запретить?

Добавлено через 37 минут
Java
1
2
3
4
5
6
7
8
9
Glide.with(MainActivity.this).load(image).asBitmap().diskCacheStrategy(DiskCacheStrategy.SOURCE).into(new SimpleTarget<Bitmap>(scrollView.getWidth(), scrollView.getHeight()) {
                @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);
                    }
                }
            });
В Runnable вызываю и из за него падает приложение.
Alexvp
107 / 71 / 8
Регистрация: 03.08.2014
Сообщений: 344
09.07.2016, 23:27     Запретить смену ориентации экрана пока идет загрузка #3
Сделайте просто. Создайте типа глобальной переменной-флага. Запускаете активити и проверяете этот флаг. Если он, например, равен 0, то считаете это первый старт и запускаете свой сетевой запрос, скажем, в отдельном сервисе. И конечно, взводите флаг. Если флаг установлен в 1 при запуске активити, то значит это был просто перезапуск при смене ориентации и не посылаете сетевой запрос.
yura91
29 / 27 / 2
Регистрация: 23.10.2013
Сообщений: 2,238
10.07.2016, 00:29  [ТС]     Запретить смену ориентации экрана пока идет загрузка #4
А эту глобальную переменную определить в Application(как поле класса)? А после того как сетевой запрос выполнен флаг опять в 0 устанавливать или он сам установится в ноль после того как пользователь по новой запустит приложение? И еще при пересоздании активити экземпляр Application еще живет верно? То есть мой флаг будет жить даже когда активити пересоздается?
Alexvp
107 / 71 / 8
Регистрация: 03.08.2014
Сообщений: 344
10.07.2016, 06:54     Запретить смену ориентации экрана пока идет загрузка #5
Вы можете создавать этот флаг разными способами, так как и управлять им. Исходите из алгоритма работы своего приложения.
Лично я создаю public class Constants, где определяю не только константы, но и такие глобальные переменные.
Лучше управлять состоянием флага самому, так как андроид может подчистить (или не подчистить) память при выходе из приложения.
yura91
29 / 27 / 2
Регистрация: 23.10.2013
Сообщений: 2,238
10.07.2016, 14:33  [ТС]     Запретить смену ориентации экрана пока идет загрузка #6
Еще такой вопрос я определяю локацию пользователя по интернету или GPS смотря что доступно. Потом делаю запрос к API Places получаю информацию о месте по координатам и загружаю изображение в фон ScrollView так же делаю запрос к API погоды и загружаю погоду в TextView это все хорошо. Но я же не знаю какой провайдер доступен в данный момент поэтому анализирую так в onCreate
Java
1
2
3
4
5
6
7
 if (locationManager
                .isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
            Location lock = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);}
if(locationManager
                .isProviderEnabled(LocationManager.GPS_PROVIDER))
        {
            Location lock = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);}
Так же есть метод
@Override
public void onLocationChanged(Location location)
У LocationListener и есть код в потоке который выполняется как после getLastKnownLocation так и в onLocationChanged. Так вот как сделать так чтобы код в потоке выполнять один раз(и данные в TextView и картинку в фон повторно не загружать) либо в onLocationChanged либо после getLastKnownLocation (потому что они оба вызываются)? Тоже через флаг надо делать?
fraley
105 / 105 / 38
Регистрация: 24.05.2015
Сообщений: 315
10.07.2016, 15:21     Запретить смену ориентации экрана пока идет загрузка #7
Цитата Сообщение от yura91 Посмотреть сообщение
В ответ приходит JSON я выделяю информацию и загружаю ее в TextView во фрагменты и в фон картинку(через Handler), но проблема в том, что если пользователь повернет экран а картинка еще не загрузилась - сетевой запрос не отработал то приложение падает....
yura91, когда вы начинаете вертеть экран активити пересоздается заново и ответ приходит в то активити которое уже не существует.
Один из вариантов прописать в манифесте в активити. Тогда оно не будет перерисовываться:
XML
1
android:configChanges="orientation|screenSize"
yura91
29 / 27 / 2
Регистрация: 23.10.2013
Сообщений: 2,238
10.07.2016, 17:28  [ТС]     Запретить смену ориентации экрана пока идет загрузка #8
android:configChanges="orientation|screenSize"
запрещает пересоздание только при поворотах, но активити может пересоздаваться и в других ситуациях. Что в этом случае делать? Как этот момент учесть?

Добавлено через 1 минуту
Я сделал для Handler
Java
1
2
3
4
5
6
7
8
 @Override
    protected void onDestroy() {
        h.removeCallbacksAndMessages(null);
        super.onDestroy();
 
        Log.d("Func", "MainActivity: onDestroy()");
 
    }
Но даже это не помогает как быть тогда?

Добавлено через 1 минуту
когда вы начинаете вертеть экран активити пересоздается заново и ответ приходит в то активити которое уже не существует
Почему сборщик мусора не убирает не существующее активити? Не успевает?

Добавлено через 44 минуты
Приложение на фрагментов элемент TextView в который необходимо загрузить результат находится во фрагменте.
Alexvp
107 / 71 / 8
Регистрация: 03.08.2014
Сообщений: 344
10.07.2016, 18:44     Запретить смену ориентации экрана пока идет загрузка #9
Цитата Сообщение от fraley Посмотреть сообщение
Тогда оно не будет перерисовываться
Это плохая практика. Нужно делать разную верстку под ландшафт и портрет. А данные получать независимо от активити, например, через сервис, и помещать их, например, в базу данных. При пересоздании активити данные берутся из базы и выводятся куда нужно при разных ориентациях экрана.
Pablito
2452 / 1897 / 590
Регистрация: 12.05.2014
Сообщений: 6,698
Завершенные тесты: 1
11.07.2016, 10:42     Запретить смену ориентации экрана пока идет загрузка #10
Цитата Сообщение от Alexvp Посмотреть сообщение
Это плохая практика
это нормальная практика, если нет разницы в разметке для разных ориентаций
Alexvp
107 / 71 / 8
Регистрация: 03.08.2014
Сообщений: 344
11.07.2016, 12:14     Запретить смену ориентации экрана пока идет загрузка #11
Цитата Сообщение от Паблито Посмотреть сообщение
если нет разницы в разметке для разных ориентаций
Обычно разница в разметке присутствует. Портретная и ландшафтная ориентации сильно отличаются.
petruchodd
90 / 90 / 8
Регистрация: 23.06.2009
Сообщений: 511
11.07.2016, 13:32     Запретить смену ориентации экрана пока идет загрузка #12
Почему не сделать примерно так : Все равно все запросы ты будешь делать в asynctask
перед стартом
Java
1
2
3
4
5
6
7
int currentOrientation = getResources().getConfiguration().orientation;
if (currentOrientation == Configuration.ORIENTATION_LANDSCAPE) {
   setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
}
else {
   setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT);
}
это запретить поворот пока выполняется действие
и на выходе в onResult
Java
1
getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
отключаем специфическую ориентацию экрана

п.с. код не мой, нашел на просторах , но сама идея должна быть понятна
yura91
29 / 27 / 2
Регистрация: 23.10.2013
Сообщений: 2,238
11.07.2016, 21:02  [ТС]     Запретить смену ориентации экрана пока идет загрузка #13
А данные получать независимо от активити, например, через сервис, и помещать их, например, в базу данных
Но сервис тоже может упасть(например если его система уничтожит из за нехватки памяти). И можно получить не все данные и поместить в базу данных, так как сервис получит только то что он мог получить до того как упал и как быть с этим?
Alexvp
107 / 71 / 8
Регистрация: 03.08.2014
Сообщений: 344
11.07.2016, 21:46     Запретить смену ориентации экрана пока идет загрузка #14
Цитата Сообщение от yura91 Посмотреть сообщение
например если его система уничтожит из за нехватки памяти
Можно запретить системе убивать сервис.
Для оценки правильности полученных данных (их целостности) есть разные способы, например, подсчет контрольных сумм.
yura91
29 / 27 / 2
Регистрация: 23.10.2013
Сообщений: 2,238
11.07.2016, 22:41  [ТС]     Запретить смену ориентации экрана пока идет загрузка #15
Можно запретить системе убивать сервис.
сервис может упасть от креша, например - библиотека creshlytics для этого есть. Если запретить системе убивать сервис это не спасет его от падения от крешей , например.
например, подсчет контрольных сумм
А как правильно подсчитывать контрольные суммы? что для этого нужно использовать?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.07.2016, 23:03     Запретить смену ориентации экрана пока идет загрузка
Еще ссылки по теме:
Android При смене ориентации экрана накладываются фрагменты
Android Задний фон при смене ориентации экрана
Выбрасывает из приложения при смене ориентации экрана Android
Не отображать SplashScreen при смене ориентации экрана Android
Android Потеря вывода при смене ориентации экрана

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

Или воспользуйтесь поиском по форуму:
Alexvp
107 / 71 / 8
Регистрация: 03.08.2014
Сообщений: 344
11.07.2016, 23:03     Запретить смену ориентации экрана пока идет загрузка #16
Цитата Сообщение от yura91 Посмотреть сообщение
Если запретить системе убивать сервис это не спасет его от падения от крешей
Если юзер долбанет по смартфону молотком, то никакие программисткие уловки тоже не помогут Не надо доходить до крайностей.
Цитата Сообщение от yura91 Посмотреть сообщение
А как правильно подсчитывать контрольные суммы?
Вы пробовали воспользоваться Гуглом? Тут не ясли, каждому шагу учить. Вам подсказали идею, далее ройте сами.
Yandex
Объявления
11.07.2016, 23:03     Запретить смену ориентации экрана пока идет загрузка
Ответ Создать тему
Опции темы

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