TCP-соединение с использованием службы

Я должен реализовать приложение. Это приложение взаимодействует с сервером, использующим TCP / IP.Мое приложение должно запрашивать позицию на сервере. Поскольку приложение должно оставаться для прослушивания запроса сервера, я думаю, что использовать IntentService. Поэтому я его реализую:

public class Tasks extends IntentService{ public final int SERVERPORT = 8100; private Socket socket; PrintWriter out; BufferedReader in; public Tasks() { super("My task!"); } protected void onHandleIntent(Intent intent) { try { InetAddress serverAddr = InetAddress.getByName("10.0.0.138"); socket = new Socket(serverAddr, SERVERPORT); out = new PrintWriter(socket.getOutputStream()); //send the request to authenticate it out.print("Hello man"); out.flush(); //now i need to receive the request Hello_ACK in = new BufferedReader(new InputStreamReader(socket.getInputStream())); String mServerMessage = in.readLine(); if(mServerMessage.equals("Hello_ACK")) Log.d("show","connection completed"); //now how can I send KEEP_ALIVE message to server? out.print("KEEP_ALIVE"); out.flush(); } catch (IOException e) { e.printStackTrace(); } } } 

Я хочу задать вам несколько вопросов: 1. Как IntentService поддерживает TCP-соединение с сервером? 2. Каждые 5 минут я должен отправить сообщение «KEEP_ALIVE» на сервер. Как я могу его поместить? 3. Я выполнил эту задачу для поддержания связи с сервером; Для вызова позиции на сервере, должен ли я использовать новый поток (например, новый класс расширяет Runnable)? 4. Неправильно ли использовать асинтекс для выполнения той же работы? 5. для связи с основным UT, я должен реализовать RegisterReceiver, это неправильно? Спасибо за помощь.

После прочтения вашего разъяснения:

  • Использование IntentService в порядке. Обратите внимание, что IntentService создает рабочий поток для обработки входящих намерений.
  • Создайте свой сокет, когда ваш сервис запущен или лениво, когда вы впервые получаете Intent . Не пересоединяйте / воссоздавайте сокет каждый раз, когда вы получаете новое намерение, как вы сейчас это делаете. Просто повторите использование существующего сокета. Возможно, вам захочется добавить поддержку для повторного подключения сокета, когда соединение падает (однако, когда вы получаете IOError ). Создание сокета лениво может быть предпочтительным, потому что вы будете делать это в правильном потоке (т. Е. Потоке обработчика намерения). Смотри ниже.
  • Вам не нужен отдельный поток для ожидания входящих данных. Просто сделайте это в потоке обработчика намерений, который вы уже получаете бесплатно. Входящие намерения будут поставлены в очередь, и ваш сервис будет обрабатывать их один за другим.
  • AsyncTask немного запутанна для многих. В отличие от postDelayed() AsyncTasks – это реальные фоновые операции с дополнительными перехватами для синхронизированных операций кадрирования. Первоначально AsyncTasks, где выполняется асинхронно в отдельном потоке. DONUT представил пул потоков, и HONEYCOMB вернулся к одному потоку, чтобы избежать общих условий гонки.

    Услуги немного разные. Создание новой службы не означает, что служба запускается в своем потоке. Скорее, для типичного варианта использования, создание основного Activity и недавно созданного Service имеет один и тот же поток, ожидающий входящих сообщений. Выполнение блокировки (например, сетевых операций ввода-вывода) в потоке пользовательского интерфейса является верным способом сделать ваше приложение безответным (и именно поэтому Android по умолчанию запрещает его ).

  • Для keep-alives вы можете просто использовать Handler.postDelayed() в своей службе. (См. Android периодически запускает задачу ). Если вы создаете обработчик в потоке обработчика Intent (т.е. тот, который создает IntentService для вас), вам даже не нужно беспокоиться о параллельном доступе.
  • Самый простой способ отправить ответы от вашей службы обратно любому отправителю намерения – использовать Context.sendBroadcast() . Чтобы использовать его, зарегистрируйте BroadcastReceiver для своей Activity с помощью Context.registerReceiver() . BroadcastReceiver получит все Intent s, которые соответствуют фильтру. Обычный метод заключается в том, чтобы придумать уникальное имя действия для Intent и фильтровать его.

[Изменить] Исправить утверждения об обработке AsyncTask .

Intereting Posts