Создание потоков внутри рабочего потока в Android

В моем приложении мне нужно сделать несколько вызовов сокетов TCP.

Чтобы сделать это, я должен сделать следующие шаги: 1. преобразовать мои данные / команду в поток байтов 2. создать сокет и отправить команду и получить ответ 3. проанализировать ответ и сохранить для использования пользовательским интерфейсом.

Теперь я создал фоновый поток, чтобы иметь возможность выполнять все три шага.

Но в моем сокет-клиенте я также хочу создать новый поток для каждой новой команды (Шаг № 2), так что это будет означать, что у меня есть несколько рабочих потоков внутри общего рабочего потока для всех трех вышеперечисленных шагов.

Итак, можно ли использовать асинхронную задачу для шага № 2, который уже выполняется в рабочем потоке. Или я использую нормальный поток в этом случае.

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

Следовательно, я не могу просто предположить, что вызов сделан из основного потока пользовательского интерфейса. Также я хотел спросить, не рекомендуется ли создавать собственные рабочие потоки в android и почему?

Спасибо солнышко

2 ответа

Решение

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

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

Я не думаю, что это будет иметь большое значение в вашем подходе к дизайну, откуда поступают запросы.

Следовательно, я не могу просто предположить, что вызов сделан из основного потока пользовательского интерфейса. Также я хотел спросить, не рекомендуется ли создавать собственные рабочие потоки в android и почему?

Android предоставляет несколько очень хороших общих классов, таких как AsyncTask и HandlerThread, для общего назначения, но любой может создать рабочий поток, если вышеперечисленные не соответствуют требованиям дизайна. Лично я создаю свои собственные рабочие потоки, если занимаюсь программированием сокетов.

Я бы посоветовал взглянуть на библиотеку Java NIO, а именно на классы Selectors и SocketChannel.

Вы не можете использовать AsyncTask для этого.

AsyncTasks могут быть созданы только в потоке пользовательского интерфейса.

Вы можете, однако, использовать стандартные темы.

class MyThread {

   @override
   public void run() {
          ......
          // when needed - span a new working thread fro within old one
          new MyOtherThread(...).start();  
   }

}

Здесь нет проблем.

если вы чувствуете, что количество создаваемых потоков может выйти из-под контроля, то разумно использовать пул потоков. В пакете java.util.concurrent есть несколько, например ThreadPoolExecutor.


Наконец, и я уже несколько раз давал эту рекомендацию, если ваша задача заключается в передаче большого количества небольших объектов с использованием многопоточной архитектуры, использование Volley, вероятно, является наиболее эффективным способом.

Удачи.

Другие вопросы по тегам