2014-07-05 7 views
1

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

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

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

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

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

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

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

Спасибо, Солнечный

ответ

0

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

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

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

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

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

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

0

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

AsyncTasks может быть только instantiated and executed on the UI thread.

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

класс MyThread {

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

}

Никаких проблем здесь.

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


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

Удачи.

Смежные вопросы