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

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

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

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

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

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

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

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

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

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

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

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

Буду очень благодарен за помощь.
0
Миниатюры
Приём сообщений от сервера в фоне  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.09.2016, 07:06
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Приём сообщений от сервера в фоне (Программирование Android):

Получение сообщений от сервера без запроса - Программирование Android
Среди существующих тем не нашёл ответа на свой вопрос, поэтому решил задать сам. Попытаюсь объяснить, что я имел в виду. Пишу...

Приём СМС - Программирование Android
Здравствуйте! Уже не первый день пытаюсь прочитать своим приложением входящее сообщение, но безрезультатно. На гаджете вообще программа...

Приём данных по Bluetooth - Программирование Android
Из Arduino посылается строка xx|xx|xx|xx|xx,xxxx|\n, где х-любое число. На андроиде получаю: х| x| x| x| итд. Подскажи как...

Приём текста по Bluetooth. Ошибки в символах - Программирование Android
Добрый день. Прошу особо не пинать. Вопрос чисто технический. Второй день ищу по поисковикам, заметил что не я один сталкивался с...

Приём сообщений методом POST - PHP
Некоторый клиент должен присылать PHP скрипту бинарный файл. Для этого он присылает http сообщение с методом POST, то есть когда в теле...

Приём сообщений без перезагрузки страницы - jQuery
Делаю чат, расскажите о http://jsfiddle.net/bv5Kq/13 Как мне реализовать это? Лист сообщений выглядит по типу <div...

59
REALIST07
Автор FAQ
Автор FAQ
181 / 181 / 14
Регистрация: 11.06.2010
Сообщений: 949
09.09.2016, 18:24 #16
Могу посоветовать сделать, как у меня на продакшне ( реализован таким способом чат), пост об этом тут
0
Alexvp
111 / 75 / 8
Регистрация: 03.08.2014
Сообщений: 380
11.09.2016, 18:27 #17
Цитата Сообщение от TonyBicbaev Посмотреть сообщение
При авторизации, сервер мне начинает присылать данные, и я уже какие мне нужно добавляю, отслеживаю.
Правильно ли я вообще построил архитектуру?
Неправильно.
Сервер должен обрабатывать запросы, даже исходя из самого слова "сервер"
Инициировать запрос на получение данных должно ваше приложение.
0
vxg
Модератор
3224 / 2027 / 231
Регистрация: 13.01.2012
Сообщений: 7,867
11.09.2016, 20:17 #18
Alexvp, и что мешает считать инициацией обмена данными авторизацию в ответ на которую сервер не просто шлёт ок, а ещё дополняет его неким блоком данных)?
0
Alexvp
111 / 75 / 8
Регистрация: 03.08.2014
Сообщений: 380
13.09.2016, 17:40 #19
Однократно? Да, это нормально и я в своих проектах так и делаю. Но, если я верно понял ТС, он хочет непрерывно принимать данные от сервера в виде неких сообщений. Т.е. приложение будет ведомым в деле обмена данными. А вот это неверно, ТС столкнулся с проблемой ловить сообщения от сервера в непредсказуемый момент.
0
TonyBicbaev
3 / 3 / 0
Регистрация: 04.11.2013
Сообщений: 133
14.09.2016, 05:35  [ТС] #20
Ну вообще как на скрине
после авторизации начинает приходить Json строки с определенным индефикатором, то есть например:
я отправил запрос на авторизации, приходит строка Connection я её разбираю, там есть поле Type принимает значение 1 и 2 в случае, если логин и пароль правильный придет 1(так же приходит строка Chat после успешной авторизации, со списком всех чатов, которые на скрине я добавил), если нет 2.

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

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

Добавлено через 34 минуты
Alexvp, ок!
0
vxg
Модератор
3224 / 2027 / 231
Регистрация: 13.01.2012
Сообщений: 7,867
14.09.2016, 12:35 #23
Alexvp, если отзывчивость должна быть высокой то слушать тоже можно
0
REALIST07
Автор FAQ
Автор FAQ
181 / 181 / 14
Регистрация: 11.06.2010
Сообщений: 949
14.09.2016, 18:57 #24
TonyBicbaev, распиши подробно, что нужно по пунктам, подумаем
0
Alexvp
111 / 75 / 8
Регистрация: 03.08.2014
Сообщений: 380
14.09.2016, 19:15 #25
Цитата Сообщение от vxg Посмотреть сообщение
если отзывчивость должна быть высокой то слушать тоже можно
Это нарушение концепции "клиент-сервер", что неизбежно приведет к потери части информации. Например, пользователь свертывает приложение и его подчищает чистильщик. Или еще что-то подобное. При этом пользователь не получит порцию сообщений, которые транслировал сервер в это время. Возникает проблема восстановления этих сообщений.
Подобная схема есть, это т.н. потоковые трансляции (например, тв в интернете). Вы начинаете смотреть с момента подключения, а что было ранее для вас потеряно.
Да и постоянное "слушание" явно будет приводить к перегрузке смарта и быстрому разряду батарейки. Не думаю, что пользователи будут в восторге.
Проще и лучше получать последние, скажем 10-20 сообщений, по запросу от приложения, например, при старте приложения. Если нужны более ранние сообщения, то при прокрутке списка они будут подгружаться с сервера.
0
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

0
REALIST07
Автор FAQ
Автор FAQ
181 / 181 / 14
Регистрация: 11.06.2010
Сообщений: 949
14.09.2016, 23:48 #27
xaat,
1) чтобы использовать технологию gsm нужен сервер ( свой собственный), который будет регистрировать устройства в системе и выдавать каждому устройству ключи, у меня где-то был набор php - скриптов с этой темой,но там все вручную вбивается
2) Посмотри внимательно gcm sdk для android, когда я его видел в последний раз там было несколько сервисов, а не один, как в моем случае
0
TonyBicbaev
3 / 3 / 0
Регистрация: 04.11.2013
Сообщений: 133
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)
0
vxg
Модератор
3224 / 2027 / 231
Регистрация: 13.01.2012
Сообщений: 7,867
15.09.2016, 06:48 #29
Цитата Сообщение от Alexvp Посмотреть сообщение
Это нарушение концепции "клиент-сервер"
вы пробовали реализовать мессенджер работающий в "реальном" режиме времени, например, как скайп на принципе "клиент запрашивает у сервера новые сообщения"? как вы думаете с какой частотой нужно молотить эти запросы что бы человек общался, а не глазел в экран как в почтовый ящик? как вы думаете что при этом будет с батареей? проблема потери связи при прослушивании никакая не проблема вообще - после потери связи клиент восстанавливает ее посылая на сервер ID последнего полученного сообщения и сервер шлет ему все начиная с ID следующего после указанного, а после пересылки переходит в режим "послал если есть новое"

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

Не по теме:

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

0
TonyBicbaev
3 / 3 / 0
Регистрация: 04.11.2013
Сообщений: 133
15.09.2016, 09:02  [ТС] #30
REALIST07,
То есть получается так :
1. Нужно подключение которое будет существовать на протяжение всей работы приложения.
2. Отправлять запросы.
3. Получать данные, и динамически их обновлять.
4. Уведомления для сообщение , при переходе которого откроется нужная активность(чат).
0
15.09.2016, 09:02
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.09.2016, 09:02
Привет! Вот еще темы с ответами:

Приём сообщения клиентом от сервера - C#
Расскажи пожалуйста, как это правильно делается. я реализовал клиент, передачу на сервер он делает успешно, но приём от сервера не знаю...

Ожидание сообщений от сервера - JavaScript
Здравствуйте, пишу многопользовательскую игру змейка на джава скрипте. Реализовано управление змейкой с помощью клавиатуры ...

Получение сообщений от сервера к клиенту - Java Сети
Всем привет.Не могу решить проблему передачи от сервера к клиенту сообщений,состоящих их нескольких строк,чтоб клиент получил сразу...

Отправка сообщений с сервера клиенту - Delphi
Всем здрасте, наверно я не первый кто задает этот вопрос. Есть сервер и есть подключающийся клиент. Клиент могет отправлять сообщения...


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

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

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