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

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

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

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

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

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

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

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

Спасибо, Санни


person Sunny    schedule 05.07.2014    source источник


Ответы (2)


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

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

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

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

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

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

person eldjon    schedule 05.07.2014

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

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

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

класс MyThread {

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

}

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

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


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

Удачи.

person Gilad Haimov    schedule 05.07.2014