Зачем создавать HandlerThread для одной цели: передать его Looper новому Handler

Я вижу много примеров в коде, где мы видим следующее:

HandlerThread thread = new HandlerThread("Thread1");
        thread.start();
        mLoadHandler = new Handler(thread.getLooper())


   mLoadHandler.post(new Runnable() {
            public void run() {
                // run some code
                //methodA();
            }
        });

Вы можете найти это также в:

https://github.com/android/platform_packages_apps_browser/blob/master/src/com/android/browser/OpenDownloadReceiver.java

https://github.com/CyanogenMod/android_packages_apps_Gallery3D/blob/8621799408a58f6b9da3492382ce929b3c93c7de/src/com/cooliris/picasa/PicasaService.java

Почему они создают HandlerThread только для одной цели: передать это Looper к новому Handler, Почему бы просто не продлить HandlerThread и сделать весь код (methodA()) там? ИЛИ создайте экземпляр обработчика и позвоните туда:

 Looper.prepare();
 Looper.loop();

2 ответа

Имея только код, который вы показываете, нет большой разницы в том, чтобы иметь дело с HandlerThread в любом случае.

Однако, если существует множество разных компонентов, пытающихся разместить разные Runnables в одном и том же потоке, вы бы не совмещали всю их логику в одном классе. В этом случае проще передать обработчик для этих различных компонентов для совместного использования. Это один сценарий, но могут быть и другие.

Если вы хотите получить обработчик, связанный с созданным вами классом ThreadHandler, вы должны передать Looper, связанный с этим ThreadHadler, в противном случае обработчик будет связан с текущим потоком, в котором он был создан. Целью создания такого HandlerThread обычно является то, что когда вы хотите выполнить одно и то же задание несколько раз, вы можете просто использовать этот объект Handler для отправки сообщения в новую ветку.

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

Другие вопросы по тегам