Переройте набор файлов, определяемых несколькими шариками с Vimgrep

Thread:

Вы можете использовать новый Thread для длительных фоновых задач без влияния на поток пользовательского интерфейса. В ветке Java вы не можете обновить ветку пользовательского интерфейса.

Поскольку обычный поток не очень полезен для архитектуры Android, были введены вспомогательные классы для потоков.

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

Обработчик :

A Handler позволяет отправлять и обрабатывать объекты Message и Runnable, связанные с MessageQueue потока. Каждый экземпляр Handler связан с одним потоком и очередью сообщений этого потока.

Существует два основных варианта использования Handler:

  1. Для планирования сообщений и исполняемых файлов, которые будут выполняться как-то в будущем;

  2. Поставить в очередь действие, которое будет выполнено в потоке, отличном от вашего.

AsyncTask :

AsyncTask обеспечивает правильное и простое использование потока пользовательского интерфейса. Этот класс позволяет выполнять фоновые операции и публиковать результаты в потоке пользовательского интерфейса без необходимости манипулировать потоками и / или обработчиками.

Недостатки:

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

  2. AsyncTask объекты также являются наиболее распространенными нарушителями для неявных ссылок. AsyncTask объекты представляют риски, связанные с явными ссылками, а также.

HandlerThread :

Вам может потребоваться более традиционный подход к выполнению блока работы над более длинным потоком ( в отличие от AsyncTask, который следует использовать для Рабочая нагрузка 5 мс ) и некоторая возможность управлять этим рабочим процессом вручную. Поток-обработчик, по сути, является долго выполняющимся потоком, который захватывает работу из очереди и обрабатывает ее.

ThreadPoolExecutor :

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

Если рабочая нагрузка больше, а одного 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 нить [тысяча сто двадцать-восемь] [тысяча сто шестьдесят-одны]

12
задан Keith Pinson 24 January 2013 в 20:51
поделиться

2 ответа

в этом каталоге

:vimgrep "search subject" *.c
:vimgrep blah *.[ch]
:vimgrep blah *.c* *.h

в этом или любом дочернем каталоге

:vimgrep "search subject" ./**/*.c
4
ответ дан 2 December 2019 в 05:28
поделиться

Для поиска "текста" во всех файлах * .txt и * .php рекурсивно из текущего каталога.

:vimgrep "text" **/*.txt **/*.php
24
ответ дан 2 December 2019 в 05:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: