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

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

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

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

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

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

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

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

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

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

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

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

Буду очень благодарен за помощь.
Миниатюры
Приём сообщений от сервера в фоне  
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
vxg
Модератор
 Аватар для vxg
2857 / 1790 / 181
Регистрация: 13.01.2012
Сообщений: 6,741
09.09.2016, 08:30     Приём сообщений от сервера в фоне #2
TonyBicbaev, покажите принципиальные моменты в виде кода, тормоза могут быть изза кривой реализации. Поток ПЕРИОДИЧЕСКИ отправляющий запрос не будет тормозить, а вот поток НЕПРЕРЫВНО атакующий сервер способен захватить для себя одно ядро
TonyBicbaev
 Аватар для TonyBicbaev
3 / 3 / 0
Регистрация: 04.11.2013
Сообщений: 123
09.09.2016, 08:52  [ТС]     Приём сообщений от сервера в фоне #3
отправление запроса один раз происходит там все норм.
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
 private void mainProcessing() {// этот метод вызываю как слушатель входящих сообщений в OnCreate
        // Здесь трудоемкие задачи переносятся в дочерний поток.
        threadBack = new Thread(null, doBackgroundThreadProcessing,
                "Background");
        threadBack.setDaemon(true);
        threadBack.start();
    }
    // Объект Runnable, который запускает метод для выполнения задач
// в фоновом режиме.
    private Runnable doBackgroundThreadProcessing = new Runnable() {
        public void run() {
            while(true) {
                backgroundThreadProcessing();
            }
        }
    };
    // Метод, который выполняет какие-то действия в фоновом режиме.
    private void backgroundThreadProcessing() {
 
            updateMsg();  //метод обрабатывающий сообщения
 
    }
 
 
/*пример как запрос отправляю, в логах все норм выводит. */
   Runnable runnable = new Runnable() {
            public void run() {
                channelID(dialogID); //отправляет запрос
                while(true)
                {
                   
                    setChannel(); //слушает ответ
                    if(endTask) {
                       
                        break;
                    }
                }
            }
        };
        Thread thread = new Thread(runnable);
        thread.setDaemon(true);
        thread.start();
vxg
Модератор
 Аватар для vxg
2857 / 1790 / 181
Регистрация: 13.01.2012
Сообщений: 6,741
09.09.2016, 09:31     Приём сообщений от сервера в фоне #4
TonyBicbaev, в вашем коде не все. о чем я пытаюсь сказать - если вы в цикле без слипов ПОСТОЯННО молотите запросы (да и вообще делаете все что угодно вплоть до пустого цикла) то вы ОЧЕНЬ сильно напряжете систему. воткните паузу между запросами. то есть если бы был действительно простой поток это бы выглядело как то так
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    private static Thread thread = null;
    private static void startThread() {
        thread = new Thread(new Runnable() {
            public void run() {
                    while (!Thread.currentThread().isInterrupted()) {
 
                        //запрашиваем и обрабатываем данные
 
                        try {
                            Thread.sleep(100);
                        } catch (InterruptedException e) {
                            Thread.currentThread().interrupt();
                        }
                    }
            }
        });
        thread.start();
    }
TonyBicbaev
 Аватар для TonyBicbaev
3 / 3 / 0
Регистрация: 04.11.2013
Сообщений: 123
09.09.2016, 09:34  [ТС]     Приём сообщений от сервера в фоне #5
попробую!
vxg
Модератор
 Аватар для vxg
2857 / 1790 / 181
Регистрация: 13.01.2012
Сообщений: 6,741
09.09.2016, 09:39     Приём сообщений от сервера в фоне #6
TonyBicbaev, возможно, если ваша задача лишь в том что бы ПЕРИОДИЧЕСКИ проверять наличие сообщений вам понадобится либо более длинный слип (100 мс - это очень мало и подходит только в качестве "вздоха" между неотложными задачами) либо делать вызов через AlarmManager. плюс ко всему придется подумать о том что когда экран гаснет все потоки замирают и если вы хотите продолжать работать в этом режиме вам придется блокировать переход в спячку
TonyBicbaev
 Аватар для TonyBicbaev
3 / 3 / 0
Регистрация: 04.11.2013
Сообщений: 123
09.09.2016, 10:02  [ТС]     Приём сообщений от сервера в фоне #7
да действительно поживее стало, спасибо!)
Мне нужен был класс который будет независимо принимать сообщения на протяжение всего жизненного цикла.
По сути как правильно сделать.
Примерная схема моего приложения.
Манифест
XML
1
2
3
 <application
        android:name=".Socket"  //объявил класс
       .......
Наследуюсь от Application
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 class Socket extends Application  {
   private WebSocketClient mWebSocketClient;
 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); //отправляем команду
            }
 
            @Override
            public void onMessage(String s) { //получаем сообщение с сервера
                final String message = s;
            
                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(); //создать подключение
 
 
    }
 
}
И пример запроса, я могу обращаться с разных классов, к этому классу
вот таким способом
Java
1
  ((Socket) this.getApplication()).connectWebSocket("1.1.3#"+login.getText()+";"+password.getText()+"|"); //отправка запроса на авторизацию
Можете дать совет как лучше, и правильнее сделать?
xaat
43 / 16 / 6
Регистрация: 05.12.2015
Сообщений: 65
09.09.2016, 10:18     Приём сообщений от сервера в фоне #8
Вопрос собственно такой, мне нужно динамически отслеживать приходящую строку, так как после авторизации сервер будет мне отсылать сообщения с данными.
Используйте Push сообщения GCM
vxg
Модератор
 Аватар для vxg
2857 / 1790 / 181
Регистрация: 13.01.2012
Сообщений: 6,741
09.09.2016, 10:18     Приём сообщений от сервера в фоне #9
Цитата Сообщение от TonyBicbaev Посмотреть сообщение
Можете дать совет как лучше, и правильнее сделать?
лучше и правильнее сделать что?
независимо принимать сообщения на протяжение всего жизненного цикла? как это согласуется отправкой запроса на авторизацию - это же явно не та задача которая будет на протяжении всего жизненного цикла

Добавлено через 12 секунд
Цитата Сообщение от xaat Посмотреть сообщение
Используйте Push сообщения GCM
которые иногда не доходят)
TonyBicbaev
 Аватар для TonyBicbaev
3 / 3 / 0
Регистрация: 04.11.2013
Сообщений: 123
09.09.2016, 10:25  [ТС]     Приём сообщений от сервера в фоне #10
авторизацию я привел как пример, как запрос отправляю. так то запросов очень много.
При авторизации, сервер мне начинает присылать данные, и я уже какие мне нужно добавляю, отслеживаю.

Правильно ли я вообще построил архитектуру? это же типо месседжера.
просто нет опыта разработки сетевых, это первое.
xaat
09.09.2016, 10:43
  #11

Не по теме:

Цитата Сообщение от vxg Посмотреть сообщение
которые иногда не доходят)
Было такое в upstream отправках, когда на устройстве с которого отправляется отключен инет. А так не замечал, хотя контроль доставки да, предусмотрен.

vxg
Модератор
 Аватар для vxg
2857 / 1790 / 181
Регистрация: 13.01.2012
Сообщений: 6,741
09.09.2016, 11:12     Приём сообщений от сервера в фоне #12
TonyBicbaev, архитектура как архитектура - отражена очевидная вещь что должен быть метод отправляющий запрос и при необходимости отправки мы этот метод вызываем. я бы просто сделал этот метод статическим что бы не уродоваться с вот такими вот конструкциями
Java
1
((Socket) this.getApplication())
Добавлено через 1 минуту
xaat, в качестве ужастика можно почитать https://habrahabr.ru/post/274169/
TonyBicbaev
 Аватар для TonyBicbaev
3 / 3 / 0
Регистрация: 04.11.2013
Сообщений: 123
09.09.2016, 11:19  [ТС]     Приём сообщений от сервера в фоне #13
То есть хватило бы просто статического класса?)
Ну у меня кстати все норм, и при выключенном экране приходит сообщение) и оповещает тоже)
Ладно спасибо)
а когда нужно использовать Service?
vxg
Модератор
 Аватар для vxg
2857 / 1790 / 181
Регистрация: 13.01.2012
Сообщений: 6,741
09.09.2016, 11:30     Приём сообщений от сервера в фоне #14
Цитата Сообщение от TonyBicbaev Посмотреть сообщение
а когда нужно использовать Service?
когда перестанут приходить сообщения при выключенном экране) выводите сообщения в лог (пусть сообщение приходит каждые 5 минут) и оставьте телефон на ночь - утром посчитаете сколько сообщений пришло
Lumber
96 / 96 / 36
Регистрация: 02.12.2015
Сообщений: 236
09.09.2016, 12:18     Приём сообщений от сервера в фоне #15
Цитата Сообщение от TonyBicbaev Посмотреть сообщение
Можете дать совет как лучше, и правильнее сделать?
сделать интерфейс (только имя не Socket, это плохое имя) с методом
void connectWebSocket(final String s);
в конструкторы классов которые его используют передавать ссылку на него.
Вызывать через эту ссылку.

Реализовать connectWebSocket(final String s) не в наследнике Application, а в своём собственном классе.
REALIST07
Автор FAQ
Автор FAQ
 Аватар для REALIST07
174 / 174 / 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
Модератор
 Аватар для vxg
2857 / 1790 / 181
Регистрация: 13.01.2012
Сообщений: 6,741
11.09.2016, 20:17     Приём сообщений от сервера в фоне #18
Alexvp, и что мешает считать инициацией обмена данными авторизацию в ответ на которую сервер не просто шлёт ок, а ещё дополняет его неким блоком данных)?
Alexvp
107 / 71 / 8
Регистрация: 03.08.2014
Сообщений: 344
13.09.2016, 17:40     Приём сообщений от сервера в фоне #19
Однократно? Да, это нормально и я в своих проектах так и делаю. Но, если я верно понял ТС, он хочет непрерывно принимать данные от сервера в виде неких сообщений. Т.е. приложение будет ведомым в деле обмена данными. А вот это неверно, ТС столкнулся с проблемой ловить сообщения от сервера в непредсказуемый момент.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.09.2016, 05:35     Приём сообщений от сервера в фоне
Еще ссылки по теме:

Android WebView в фоне
Приём текста по Bluetooth. Ошибки в символах Android
Android Использование микрофона в фоне
Android Приём данных по Bluetooth
Повторение операции в фоне Android

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

Или воспользуйтесь поиском по форуму:
TonyBicbaev
 Аватар для TonyBicbaev
3 / 3 / 0
Регистрация: 04.11.2013
Сообщений: 123
14.09.2016, 05:35  [ТС]     Приём сообщений от сервера в фоне #20
Ну вообще как на скрине
после авторизации начинает приходить Json строки с определенным индефикатором, то есть например:
я отправил запрос на авторизации, приходит строка Connection я её разбираю, там есть поле Type принимает значение 1 и 2 в случае, если логин и пароль правильный придет 1(так же приходит строка Chat после успешной авторизации, со списком всех чатов, которые на скрине я добавил), если нет 2.

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

Добавлено через 5 минут
И дело в том что когда другие люди пишут, строка тоже приходит, соотвецветно, поэтому и нужно постоянно слушать, что бы обновлять чат, или список диалогов
Yandex
Объявления
14.09.2016, 05:35     Приём сообщений от сервера в фоне
Ответ Создать тему
Опции темы

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