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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.87
TonyBicbaev
3 / 3 / 0
Регистрация: 04.11.2013
Сообщений: 129
#1

Приём сообщений от сервера в фоне - Программирование Android

09.09.2016, 07:06. Просмотров 2128. Ответов 59
Метки нет (Все метки)

Привет, нужна помощь в структуре.
Первый раз работаю с подключением.
В общем к делу:
1.Отправляю запрос на сервер
2.У меня есть tabhost, инициализирую его с двумя классами, диалоги, и звонки.
3. Сейчас после запроса мне приходит ответ в виде Json строки, распарспарсиваю и заполняю как на скрине.

Вопрос собственно такой, мне нужно динамически отслеживать приходящую строку, так как после авторизации сервер будет мне отсылать сообщения с данными.

Как только прийдет сообщение мне нужно сразу обновить.

Я использую обычный Thread , AsyncTask не подходит так как он же выполняется один раз.

А мне нужно слушать на протяжение всей жизни приложения. Все бы нечего, но на слабых одноядерных с оперативой 512 жутко тормозит.

Обращаюсь сюда потому что нужен совет людей по опытней.

Так же я понял что нужно скорее всего использовать подключение в Service, и выводить уведомления с помощью Reciver. Но не знаю как применить это к моему коду.

Буду очень благодарен за помощь.
Миниатюры
Приём сообщений от сервера в фоне  
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
REALIST07
Автор FAQ
Автор FAQ
176 / 176 / 13
Регистрация: 11.06.2010
Сообщений: 932
09.09.2016, 18:24     Приём сообщений от сервера в фоне #16
Могу посоветовать сделать, как у меня на продакшне ( реализован таким способом чат), пост об этом тут
Alexvp
107 / 71 / 8
Регистрация: 03.08.2014
Сообщений: 344
11.09.2016, 18:27     Приём сообщений от сервера в фоне #17
Цитата Сообщение от TonyBicbaev Посмотреть сообщение
При авторизации, сервер мне начинает присылать данные, и я уже какие мне нужно добавляю, отслеживаю.
Правильно ли я вообще построил архитектуру?
Неправильно.
Сервер должен обрабатывать запросы, даже исходя из самого слова "сервер"
Инициировать запрос на получение данных должно ваше приложение.
vxg
Модератор
3146 / 1948 / 214
Регистрация: 13.01.2012
Сообщений: 7,439
11.09.2016, 20:17     Приём сообщений от сервера в фоне #18
Alexvp, и что мешает считать инициацией обмена данными авторизацию в ответ на которую сервер не просто шлёт ок, а ещё дополняет его неким блоком данных)?
Alexvp
107 / 71 / 8
Регистрация: 03.08.2014
Сообщений: 344
13.09.2016, 17:40     Приём сообщений от сервера в фоне #19
Однократно? Да, это нормально и я в своих проектах так и делаю. Но, если я верно понял ТС, он хочет непрерывно принимать данные от сервера в виде неких сообщений. Т.е. приложение будет ведомым в деле обмена данными. А вот это неверно, ТС столкнулся с проблемой ловить сообщения от сервера в непредсказуемый момент.
TonyBicbaev
3 / 3 / 0
Регистрация: 04.11.2013
Сообщений: 129
14.09.2016, 05:35  [ТС]     Приём сообщений от сервера в фоне #20
Ну вообще как на скрине
после авторизации начинает приходить Json строки с определенным индефикатором, то есть например:
я отправил запрос на авторизации, приходит строка Connection я её разбираю, там есть поле Type принимает значение 1 и 2 в случае, если логин и пароль правильный придет 1(так же приходит строка Chat после успешной авторизации, со списком всех чатов, которые на скрине я добавил), если нет 2.

Так и с чатом, я отправляю запрос на добавление теста в определенный диалог, приходит строка Message. я ё разбираю, и добавляю

Добавлено через 5 минут
И дело в том что когда другие люди пишут, строка тоже приходит, соотвецветно, поэтому и нужно постоянно слушать, что бы обновлять чат, или список диалогов
Alexvp
107 / 71 / 8
Регистрация: 03.08.2014
Сообщений: 344
14.09.2016, 10:18     Приём сообщений от сервера в фоне #21
Цитата Сообщение от TonyBicbaev Посмотреть сообщение
поэтому и нужно постоянно слушать
Еще раз. В вашем случае "слушать" это периодически запрашивать сервер.
TonyBicbaev
3 / 3 / 0
Регистрация: 04.11.2013
Сообщений: 129
14.09.2016, 11:35  [ТС]     Приём сообщений от сервера в фоне #22
REALIST07, Посмотрел ваше решение скорее всего точно мне и нужно но я пока не понял как мне со своим кодом связать. Точнее я не понял как связать подключение с сервесом.
1. где моё подключение создавать? в App или сервесе?
2. как запросы отправлять?
Я конечно сам попробую сейчас потыкаться. но без помощи точно не разберусь)

Добавлено через 34 минуты
Alexvp, ок!
vxg
Модератор
3146 / 1948 / 214
Регистрация: 13.01.2012
Сообщений: 7,439
14.09.2016, 12:35     Приём сообщений от сервера в фоне #23
Alexvp, если отзывчивость должна быть высокой то слушать тоже можно
REALIST07
Автор FAQ
Автор FAQ
176 / 176 / 13
Регистрация: 11.06.2010
Сообщений: 932
14.09.2016, 18:57     Приём сообщений от сервера в фоне #24
TonyBicbaev, распиши подробно, что нужно по пунктам, подумаем
Alexvp
107 / 71 / 8
Регистрация: 03.08.2014
Сообщений: 344
14.09.2016, 19:15     Приём сообщений от сервера в фоне #25
Цитата Сообщение от vxg Посмотреть сообщение
если отзывчивость должна быть высокой то слушать тоже можно
Это нарушение концепции "клиент-сервер", что неизбежно приведет к потери части информации. Например, пользователь свертывает приложение и его подчищает чистильщик. Или еще что-то подобное. При этом пользователь не получит порцию сообщений, которые транслировал сервер в это время. Возникает проблема восстановления этих сообщений.
Подобная схема есть, это т.н. потоковые трансляции (например, тв в интернете). Вы начинаете смотреть с момента подключения, а что было ранее для вас потеряно.
Да и постоянное "слушание" явно будет приводить к перегрузке смарта и быстрому разряду батарейки. Не думаю, что пользователи будут в восторге.
Проще и лучше получать последние, скажем 10-20 сообщений, по запросу от приложения, например, при старте приложения. Если нужны более ранние сообщения, то при прокрутке списка они будут подгружаться с сервера.
xaat
14.09.2016, 19:30
  #26

Не по теме:

Не хочу быть навязчивым... но все таки... бросайте велосипедостроение, пожалейте батарею ) используйте GCM
Вот небольшой перечень кто его использует:

Social Networking:

1. Google Plus

2. Twitter

3. Pinterest

4. Facebook

5. LinkedIn

6. Instagram


Forum Discussions

1. Topify

2. Tapatalk



Text Messaging (plus voice):

1. Facebook Messenger

2. Viber

3. Text Free: Calling Texting App

4. Meow

5. LINE

6. WhatsApp Messenger

7. Skype

REALIST07
Автор FAQ
Автор FAQ
176 / 176 / 13
Регистрация: 11.06.2010
Сообщений: 932
14.09.2016, 23:48     Приём сообщений от сервера в фоне #27
xaat,
1) чтобы использовать технологию gsm нужен сервер ( свой собственный), который будет регистрировать устройства в системе и выдавать каждому устройству ключи, у меня где-то был набор php - скриптов с этой темой,но там все вручную вбивается
2) Посмотри внимательно gcm sdk для android, когда я его видел в последний раз там было несколько сервисов, а не один, как в моем случае
TonyBicbaev
3 / 3 / 0
Регистрация: 04.11.2013
Сообщений: 129
15.09.2016, 05:57  [ТС]     Приём сообщений от сервера в фоне #28
REALIST07,
1. Есть кнопка вход, при нажатие на неё я отправлял запрос на авторизацию
Java
1
((Socket) this.getApplication()).connectWebSocket("1.1.3#Логин;Пароль|"); // такой формат запроса где 1.1.3# это команда, Логин Пароль это параметры
2. Когда я нажимаю мы обращаемся в этот класс
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
  public void connectWebSocket(final String s) { /*метод подключения*/
 
        URI uri;
        try {
            uri = new URI(SERVER );   //сервер
        } catch (URISyntaxException e) {
            e.printStackTrace();
            return;
        }
        mWebSocketClient = new WebSocketClient(uri,new Draft_17()) {
            @Override
            public void onOpen(ServerHandshake serverHandshake) {
                Log.i("Websocket", "Opened");
                mWebSocketClient.send(s); //отпровляем команнду
 
                Log.i("e", "e" + s);
 
            }
 
            @Override
            public void onMessage(String s) { //получаем сообщение с сервера
                final String message = s;
               Log.e("m","m ="+message);
                treatmentMesage(message); //метод обработки сообщения
 
            }
 
            @Override
            public void onClose(int i, String s, boolean b) { 
                Log.i("Websocket", "Closed " + s);
           
 
            }
 
            @Override
            public void onError(Exception e) { //ошибка соединения
                Log.i("Websocket", "Error " + e.getMessage());
 
        
            }
        };
 
               mWebSocketClient.connect(); //создать подключение
 
 
    }
3. В логах я вижу как начинает приходить сообщение с сервера и обрабатываю его в методе
Java
1
2
3
4
5
6
7
   @Override
            public void onMessage(String s) { //получаем сообщение с сервера
                final String message = s;
               Log.e("m","m ="+message);
                treatmentMesage(message); //метод обработки сообщения
 
            }
4.строка в виде:
JSON
1
09-15 09:09:30.033 3451-3517/com.chat.chat_v100 E/m: m ={"type":"Connection","body":{"Type":"on","GroupID":null,"userT":"user","Id":41726,"chat":{"Id":41726,"Fio":"Усольцева Вера Витальевна (v_surkov@meshalkin.ru)","Email":"Гостиница ФГБУ ННИИПК Е.Н. Мешалкина","Phone":"","Readlytime":null,"LastMessage":null,"Site":null,"Status":null,"IP":"::1","Region":"::1","HomeTown":"::1","new_count_mes":null,"status_of_chat":null}}}
5. обрабатываю строку в зависимости от пришедшего типа.
запихиваю нужную информацию в ArrayList
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
 public void treatmentMesage(String s) {
 
        try {
 
            dataJsonObj = new JSONObject(s);
            String chats = dataJsonObj.getString("type");
            JSONObject bodyDataJsonObj = null;
            JSONObject newChatJsonObj = null;
            JSONObject connectDataJsonObj = null;
            switch (chats) {  //входящие сообщения
                case "Connection": //подключения
                    String bodyConnect = dataJsonObj.getString("body");
                    connectDataJsonObj = new JSONObject(bodyConnect);
                    String type = connectDataJsonObj.getString("Type");
                    String groupid = connectDataJsonObj.getString("GroupID");
                    String userT = connectDataJsonObj.getString("userT");
                    String Id = connectDataJsonObj.getString("Id");
                    String chat = connectDataJsonObj.getString("chat");
                    if(type.equals("fail"))
                    {
                        setQ(11);
                    }
 
                    break;
                case "Chats":  //чат
                  //  setQ(2);
                    jpm = new JsonParseMessage();
                    jpm.messageExpanded(s);
                    getArray();
 
 
                    break;
                case "Chanels": //каналы
 
                    jpm = new JsonParseMessage();
                    jpm.messageExpanded(s);
                    Log.e("12", "12");
 
                    // Log.e("m","m ="+s);
                    getChannels();
 
                    break;
                case "Message": //сообщения
                ......
6. И уже в другом классе в потоке отслеживаю по вот этому идентификатору setQ(2);
Java
1
2
3
4
5
6
7
8
9
10
11
12
   if(((Socket)this.getApplication()).getQ() == 2)
            {
 
                int counter = 0;
                for(int i = 0; i<  ((Socket)this.getApplication()).getId_dialog().size() ; i++) {
          
                    Dialog d = new Dialog(((Socket)this.getApplication()).getId_dialog().get(i),((Socket)this.getApplication()).getMail().get(i),
                            ((Socket)this.getApplication()).getName().get(i),((Socket)this.getApplication()).getReadlyTime().get(i),((Socket)this.getApplication()).getLastMessage().get(i),
                            ((Socket)this.getApplication()).getChat_channel_id2().get(i),((Socket)this.getApplication()).getChat_channel_id3().get(i));
                    dialogArray.add(i,d);
                
                }
7. Со всеми остальными запросами аналогично.
Как то так

Про соединение правильно было подмечено, но я с сервером нечего не могу сделать у меня задача ток клиент написать.

Добавлено через 35 минут
REALIST07, ну потом еще и уведомление вывести, если сообщение пришло (Message)
vxg
Модератор
3146 / 1948 / 214
Регистрация: 13.01.2012
Сообщений: 7,439
15.09.2016, 06:48     Приём сообщений от сервера в фоне #29
Цитата Сообщение от Alexvp Посмотреть сообщение
Это нарушение концепции "клиент-сервер"
вы пробовали реализовать мессенджер работающий в "реальном" режиме времени, например, как скайп на принципе "клиент запрашивает у сервера новые сообщения"? как вы думаете с какой частотой нужно молотить эти запросы что бы человек общался, а не глазел в экран как в почтовый ящик? как вы думаете что при этом будет с батареей? проблема потери связи при прослушивании никакая не проблема вообще - после потери связи клиент восстанавливает ее посылая на сервер ID последнего полученного сообщения и сервер шлет ему все начиная с ID следующего после указанного, а после пересылки переходит в режим "послал если есть новое"

Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от xaat Посмотреть сообщение
Вот небольшой перечень кто его использует
на IOS особенно доставляет работа Skype - сообщения туда приходят только если вы откроете переписку. и то не факт что придут) видимо что-то очень модное там накрутили

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.09.2016, 09:02     Приём сообщений от сервера в фоне
Еще ссылки по теме:
Приложение в фоне, трее Android
Android Использование микрофона в фоне
Повторение операции в фоне Android
Маленькое изображение на фоне большого Android
Android Прозрачные кружки на полупрозрачном фоне

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

Или воспользуйтесь поиском по форуму:
TonyBicbaev
3 / 3 / 0
Регистрация: 04.11.2013
Сообщений: 129
15.09.2016, 09:02  [ТС]     Приём сообщений от сервера в фоне #30
REALIST07,
То есть получается так :
1. Нужно подключение которое будет существовать на протяжение всей работы приложения.
2. Отправлять запросы.
3. Получать данные, и динамически их обновлять.
4. Уведомления для сообщение , при переходе которого откроется нужная активность(чат).
Yandex
Объявления
15.09.2016, 09:02     Приём сообщений от сервера в фоне
Ответ Создать тему
Опции темы

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