Создание потоков внутри рабочего потока в 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, вероятно, является наиболее эффективным способом.
Удачи.