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

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

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

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

09.07.2016, 20:26. Просмотров 359. Ответов 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 секунд
Можно ли как то на время сетевого запроса(загрузки информации во фрагменты) запретить пользователю поворачивать экран?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.07.2016, 20:26
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Запретить смену ориентации экрана пока идет загрузка (Программирование Android):

Запретить смену ориентации экрана - Программирование Android
имеется проблема в большом весе приложения и нежелании делать отдельные фоны для активити для горизонтальной ориентации. Как сделать чтобы...

Как запретить смену ориентации при вызове DialogFragment? - Программирование Android
В активити вызывается DialogFragment, как запретить смену ориентации экрана пока он активен?

Изменение ориентации экрана - Программирование Android
здравствуйте. возник вопрос,допустим я программно запретил изменения экрана ...

Смена ориентации экрана - Программирование Android
в папке layout файл screen.xml &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt; &lt;LinearLayout ...

Событие смены ориентации экрана - Программирование Android
доброго времени суток у меня такой вопрос как написать оброботчик события смены оринтация экрана например как это записать ...

Поведение после смены ориентации экрана - Программирование Android
Доброго времени суток. У меня есть 2 xml layout файла для вертикальной и горизонтальной ориентации дисплея c тем самим набором елементов....

15
yura91
1 / 25 / 2
Регистрация: 23.10.2013
Сообщений: 2,310
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 вызываю и из за него падает приложение.
0
Alexvp
108 / 72 / 8
Регистрация: 03.08.2014
Сообщений: 348
09.07.2016, 23:27 #3
Сделайте просто. Создайте типа глобальной переменной-флага. Запускаете активити и проверяете этот флаг. Если он, например, равен 0, то считаете это первый старт и запускаете свой сетевой запрос, скажем, в отдельном сервисе. И конечно, взводите флаг. Если флаг установлен в 1 при запуске активити, то значит это был просто перезапуск при смене ориентации и не посылаете сетевой запрос.
0
yura91
1 / 25 / 2
Регистрация: 23.10.2013
Сообщений: 2,310
10.07.2016, 00:29  [ТС] #4
А эту глобальную переменную определить в Application(как поле класса)? А после того как сетевой запрос выполнен флаг опять в 0 устанавливать или он сам установится в ноль после того как пользователь по новой запустит приложение? И еще при пересоздании активити экземпляр Application еще живет верно? То есть мой флаг будет жить даже когда активити пересоздается?
0
Alexvp
108 / 72 / 8
Регистрация: 03.08.2014
Сообщений: 348
10.07.2016, 06:54 #5
Вы можете создавать этот флаг разными способами, так как и управлять им. Исходите из алгоритма работы своего приложения.
Лично я создаю public class Constants, где определяю не только константы, но и такие глобальные переменные.
Лучше управлять состоянием флага самому, так как андроид может подчистить (или не подчистить) память при выходе из приложения.
0
yura91
1 / 25 / 2
Регистрация: 23.10.2013
Сообщений: 2,310
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 (потому что они оба вызываются)? Тоже через флаг надо делать?
0
fraley
106 / 106 / 40
Регистрация: 24.05.2015
Сообщений: 322
10.07.2016, 15:21 #7
Цитата Сообщение от yura91 Посмотреть сообщение
В ответ приходит JSON я выделяю информацию и загружаю ее в TextView во фрагменты и в фон картинку(через Handler), но проблема в том, что если пользователь повернет экран а картинка еще не загрузилась - сетевой запрос не отработал то приложение падает....
yura91, когда вы начинаете вертеть экран активити пересоздается заново и ответ приходит в то активити которое уже не существует.
Один из вариантов прописать в манифесте в активити. Тогда оно не будет перерисовываться:
XML
1
android:configChanges="orientation|screenSize"
0
yura91
1 / 25 / 2
Регистрация: 23.10.2013
Сообщений: 2,310
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 в который необходимо загрузить результат находится во фрагменте.
0
Alexvp
108 / 72 / 8
Регистрация: 03.08.2014
Сообщений: 348
10.07.2016, 18:44 #9
Цитата Сообщение от fraley Посмотреть сообщение
Тогда оно не будет перерисовываться
Это плохая практика. Нужно делать разную верстку под ландшафт и портрет. А данные получать независимо от активити, например, через сервис, и помещать их, например, в базу данных. При пересоздании активити данные берутся из базы и выводятся куда нужно при разных ориентациях экрана.
0
Pablito
2505 / 1989 / 619
Регистрация: 12.05.2014
Сообщений: 6,943
Завершенные тесты: 1
11.07.2016, 10:42 #10
Цитата Сообщение от Alexvp Посмотреть сообщение
Это плохая практика
это нормальная практика, если нет разницы в разметке для разных ориентаций
0
Alexvp
108 / 72 / 8
Регистрация: 03.08.2014
Сообщений: 348
11.07.2016, 12:14 #11
Цитата Сообщение от Паблито Посмотреть сообщение
если нет разницы в разметке для разных ориентаций
Обычно разница в разметке присутствует. Портретная и ландшафтная ориентации сильно отличаются.
0
petruchodd
103 / 102 / 9
Регистрация: 23.06.2009
Сообщений: 561
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);
отключаем специфическую ориентацию экрана

п.с. код не мой, нашел на просторах , но сама идея должна быть понятна
0
yura91
1 / 25 / 2
Регистрация: 23.10.2013
Сообщений: 2,310
11.07.2016, 21:02  [ТС] #13
А данные получать независимо от активити, например, через сервис, и помещать их, например, в базу данных
Но сервис тоже может упасть(например если его система уничтожит из за нехватки памяти). И можно получить не все данные и поместить в базу данных, так как сервис получит только то что он мог получить до того как упал и как быть с этим?
0
Alexvp
108 / 72 / 8
Регистрация: 03.08.2014
Сообщений: 348
11.07.2016, 21:46 #14
Цитата Сообщение от yura91 Посмотреть сообщение
например если его система уничтожит из за нехватки памяти
Можно запретить системе убивать сервис.
Для оценки правильности полученных данных (их целостности) есть разные способы, например, подсчет контрольных сумм.
0
yura91
1 / 25 / 2
Регистрация: 23.10.2013
Сообщений: 2,310
11.07.2016, 22:41  [ТС] #15
Можно запретить системе убивать сервис.
сервис может упасть от креша, например - библиотека creshlytics для этого есть. Если запретить системе убивать сервис это не спасет его от падения от крешей , например.
например, подсчет контрольных сумм
А как правильно подсчитывать контрольные суммы? что для этого нужно использовать?
0
11.07.2016, 22:41
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.07.2016, 22:41
Привет! Вот еще темы с ответами:

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

Задний фон при смене ориентации экрана - Программирование Android
Здравствуйте! Мне надо чтобы фон не сжимался так, а как в HTML оптимизировал под размер экрана... Заранее спасибо! (Приложение и картинка...

SurfaceView при изменении ориентации экрана перегружается - Программирование Android
при создании тетриса возник вопрос. один из моих классов расширяет класс SurfaceView public class TetrisView extends SurfaceView ...

При смене ориентации экрана накладываются фрагменты - Программирование Android
Юзаю Android.Support.V4.App.Fragment, вроде бы все нормально. При переключении из меню фрагменты скрываю отправляя в &quot;стек&quot; а кликнутый...


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

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

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