Thread
:
Вы можете использовать новый Thread
для длительных фоновых задач без влияния на поток пользовательского интерфейса. В ветке Java вы не можете обновить ветку пользовательского интерфейса.
Поскольку обычный поток не очень полезен для архитектуры Android, были введены вспомогательные классы для потоков.
Вы можете найти ответы на свои вопросы на странице документации по производительности потоков .
A Handler
позволяет отправлять и обрабатывать объекты Message и Runnable
, связанные с MessageQueue
потока. Каждый экземпляр Handler
связан с одним потоком и очередью сообщений этого потока.
Существует два основных варианта использования Handler
:
Для планирования сообщений и исполняемых файлов, которые будут выполняться как-то в будущем;
Поставить в очередь действие, которое будет выполнено в потоке, отличном от вашего.
AsyncTask
обеспечивает правильное и простое использование потока пользовательского интерфейса. Этот класс позволяет выполнять фоновые операции и публиковать результаты в потоке пользовательского интерфейса без необходимости манипулировать потоками и / или обработчиками.
Недостатки:
По умолчанию приложение помещает все объекты AsyncTask
, которые оно создает, в один поток. Поэтому они выполняются последовательно и, как и в случае основного потока, особенно длинный рабочий пакет может блокировать очередь. По этой причине используйте AsyncTask для обработки рабочих элементов, длина которых меньше 5 мс .
AsyncTask
объекты также являются наиболее распространенными нарушителями для неявных ссылок. AsyncTask
объекты представляют риски, связанные с явными ссылками, а также.
Вам может потребоваться более традиционный подход к выполнению блока работы над более длинным потоком ( в отличие от AsyncTask, который следует использовать для Рабочая нагрузка 5 мс ) и некоторая возможность управлять этим рабочим процессом вручную. Поток-обработчик, по сути, является долго выполняющимся потоком, который захватывает работу из очереди и обрабатывает ее.
Этот класс управляет созданием группы потоков, устанавливает их приоритеты и управляет распределением работы между этими потоками. Когда рабочая нагрузка увеличивается или уменьшается, класс раскручивается или уничтожает больше потоков, чтобы приспособиться к рабочей нагрузке.
Если рабочая нагрузка больше, а одного HandlerThread
недостаточно, вы можете перейти к ThreadPoolExecutor
Однако я хотел бы, чтобы соединение сокетов выполнялось в службе. Должно ли это выполняться в обработчике или потоке, или даже в AsyncTask? Взаимодействие с интерфейсом вообще не нужно. Имеет ли это значение с точки зрения производительности, которую я использую?
Поскольку взаимодействие с пользовательским интерфейсом не требуется, вы не можете пойти на AsyncTask
. Обычные потоки не очень полезны и, следовательно, HandlerThread
- лучший вариант. Поскольку вы должны поддерживать сокетное соединение, обработчик в главном потоке вообще бесполезен. Создайте HandlerThread
и получите Handler
от петлителя HandlerThread
.
HandlerThread handlerThread = new HandlerThread("SocketOperation");
handlerThread.start();
Handler requestHandler = new Handler(handlerThread.getLooper());
requestHandler.post(myRunnable); // where myRunnable is your Runnable object.
Если вы хотите связаться с потоком пользовательского интерфейса, вы можете использовать еще один обработчик для обработки ответа.
final Handler responseHandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
//txtView.setText((String) msg.obj);
Toast.makeText(MainActivity.this,
"Foreground task is completed:"+(String)msg.obj,
Toast.LENGTH_LONG)
.show();
}
};
в вашем Runnable
вы можете добавить
responseHandler.sendMessage(msg);
Более подробную информацию о реализации можно найти здесь:
Android: Toast in a нить [тысяча сто двадцать-восемь] [тысяча сто шестьдесят-одны]
в этом каталоге
:vimgrep "search subject" *.c
:vimgrep blah *.[ch]
:vimgrep blah *.c* *.h
в этом или любом дочернем каталоге
:vimgrep "search subject" ./**/*.c
Для поиска "текста" во всех файлах * .txt и * .php рекурсивно из текущего каталога.
:vimgrep "text" **/*.txt **/*.php