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

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

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

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

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

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

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

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

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

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

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

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

Буду очень благодарен за помощь.
Миниатюры
Приём сообщений от сервера в фоне  
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...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
vxg
Модератор
3156 / 1958 / 218
Регистрация: 13.01.2012
Сообщений: 7,487
09.09.2016, 08:30 #2
TonyBicbaev, покажите принципиальные моменты в виде кода, тормоза могут быть изза кривой реализации. Поток ПЕРИОДИЧЕСКИ отправляющий запрос не будет тормозить, а вот поток НЕПРЕРЫВНО атакующий сервер способен захватить для себя одно ядро
TonyBicbaev
3 / 3 / 0
Регистрация: 04.11.2013
Сообщений: 129
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
Модератор
3156 / 1958 / 218
Регистрация: 13.01.2012
Сообщений: 7,487
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
3 / 3 / 0
Регистрация: 04.11.2013
Сообщений: 129
09.09.2016, 09:34  [ТС] #5
попробую!
vxg
Модератор
3156 / 1958 / 218
Регистрация: 13.01.2012
Сообщений: 7,487
09.09.2016, 09:39 #6
TonyBicbaev, возможно, если ваша задача лишь в том что бы ПЕРИОДИЧЕСКИ проверять наличие сообщений вам понадобится либо более длинный слип (100 мс - это очень мало и подходит только в качестве "вздоха" между неотложными задачами) либо делать вызов через AlarmManager. плюс ко всему придется подумать о том что когда экран гаснет все потоки замирают и если вы хотите продолжать работать в этом режиме вам придется блокировать переход в спячку
TonyBicbaev
3 / 3 / 0
Регистрация: 04.11.2013
Сообщений: 129
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
Модератор
3156 / 1958 / 218
Регистрация: 13.01.2012
Сообщений: 7,487
09.09.2016, 10:18 #9
Цитата Сообщение от TonyBicbaev Посмотреть сообщение
Можете дать совет как лучше, и правильнее сделать?
лучше и правильнее сделать что?
независимо принимать сообщения на протяжение всего жизненного цикла? как это согласуется отправкой запроса на авторизацию - это же явно не та задача которая будет на протяжении всего жизненного цикла

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

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

Не по теме:

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

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

Реализовать connectWebSocket(final String s) не в наследнике Application, а в своём собственном классе.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.09.2016, 12:18
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
09.09.2016, 12:18
Ответ Создать тему
Опции темы

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