2

Я вижу много примеров в коде были мы видим следующую вещь:Почему создание HandlerThread для одной цели: чтобы передать это Looper к новому обработчику

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 Ань ew Handler. Почему бы не просто расширить HandlerThread и сделать весь код (methodA())? ИЛИ создать экземпляр обработчика и позвонить туда:

Looper.prepare(); 
Looper.loop(); 
+0

поэтому отправьте код пользовательского класса 'HandlerThread', а также grep официальный код Android и посмотрите, как Google использует класс' HandlerThread' – pskink

+0

@RonTR. Я предоставил один сценарий в нижеприведенном ответе, в котором вы задаете вопрос о том, почему кто-то решил бы создать новый HandlerThread и отправить Runnables на него вместо того, чтобы поместить всю логику в собственный подкласс HandlerThread. Было ли это ясно, почему кто-то принял это дизайнерское решение? –

+0

@DougStevenson, Спасибо за ответ, но я действительно не вижу никакой разницы, можете ли вы поделиться каким-то кодом, чтобы точно увидеть разницу? – RonTr

ответ

0

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

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

+1

Я думаю, что это должно быть в разделе комментариев, а не в ответе –

+0

Это отвечает вопрос: почему они создают HandlerThread только для одной цели: передать Looper новому обработчику. Почему бы не просто расширить HandlerThread и выполнить весь код (methodA())? –

+0

У меня нет большой проблемы с вопросом, как было задано. Я предоставил один случай, когда кто-то создавал и делил новый HandlerThread среди Runnables вместо того, чтобы подклассифицировать его и помещать туда всю логику. Я не могу предоставить их все, но это правильный сценарий по запросу. –

0

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

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

+0

Я не понимаю ответа, вы можете расширять «HandlerThread», а также выполнять однотипную работу несколько раз. можете ли вы представить пример кода ... – RonTr

+0

обновили ответ –