Как да използвате правилно HandlerThread със сокет?

Разглеждах класа HandlerThread, тъй като първоначално използвах проста нишка и манипулатор, но дойде cropper с NetworkOnMainThreadException в android.

Изглежда не мога да разбера как бих могъл да въведа неща като сокети в HandlerThread, нещо, където бихте поставили блокиращия код в изпълнение. Но не можете да направите това с HandlerThread, тъй като не трябва да отменяте run, тъй като там е looper.

И не мога да извикам HandlerThread чрез съобщения, за да започна да слушам сокети, тъй като тогава ще блокира всички други съобщения, предадени към него.

Така че този клас HandlerThread предназначен ли е за задачи, които не са блокиращи? Тъй като изглежда не мога да разбера как мога да използвам такава нишка, така че да може да слуша в сокет, но да може да обработва заявки Както когато създавах нормална нишка от основната нишка на потребителския интерфейс

Бих могъл в нормална нишка да извикам Looper.prepare() и Looper.loop() в изпълнение, след което да поставя кода между тези два реда (с проверка за създаване на манипулатора), но след това имам проблеми с комуникацията с тази нова нишка, съобщенията не се предават в нишката.

И така, как да създам нишки, които могат да използват манипулатори, за да комуникират помежду си и да изпълняват задачи като използване на сокети.

Моля, не търся да използвам ASyncTask коментари, искам да знам как мога сам да използвам нишки, така че нишките да могат да комуникират помежду си


person NiffyDroid    schedule 19.02.2013    source източник
comment
Направих още няколко теста, в отделен проект с andengine. В OnCreate създавам своя манипулатор на главния клас с помощта на onRunUIThread, след което създавам нишката отново с помощта на onRunUIThread. След това, ако тази нишка създаде друга нишка, новата вътрешна нишка трябва да извика looper. Изглежда, че работи добре, така че нямам представа защо получавах NetworkOnMainThreadException, тъй като новият проект има същите цели и на същия телефон, е малко объркващо.   -  person NiffyDroid    schedule 21.02.2013


Отговори (1)


Мислете за HandlerThread като за работна нишка, която има Looper, чакаща за изпълнение на съобщения (което може да създаде нов Thread). Така че, за да комуникирате с него, просто подгответе Message обект и го изпратете до манипулатора (напр. можете да започнете нов thread за четене на сокет) напр.

Handler handler = new Handler(handlerThread.getLooper()){
   @Override
   public void handleMessage(Message msg) {
      // Do action based on this message
   }
}

Обикновено HandlerThread е удобно, когато слушате events, което изисква Looper напр. requestLocationUpdates.

Не е необходимо да използвате HandlerThread, за да избегнете NetworkOnMainThreadException (не знам как получавате това изключение, ако използвате Thread според въпроса си) и за да го използвате с sockets, просто използвайте нормална нишка и извършете вашата socket операция в run метод

person iTech    schedule 19.02.2013
comment
NetworkOnMainThreadException възниква, защото, за да може една нормална нишка да зацикли, тя трябва да бъде актуализирана, известна още като looper, следователно създаването и стартирането на нишката на потребителския интерфейс настройва looper вместо вас. но публикуване на пчелна пита не можете да направите това, така че правете лоупера сами или използвайте нишка за манипулиране. Нормална нишка, до която не мога да изпращам съобщения, въпреки че има нейния манипулатор, handlerthread не можете да поставите кода в изпълнение и не можете да поставите код в метод, тъй като това би блокирало съобщенията за спиране на нишката. Така предаването на съобщение за слушане на сокет би блокирало, така че предаването на съобщение за изпращане на сокета ще бъде блокирано. - person NiffyDroid; 20.02.2013
comment
Слушането на socket не изисква Looper, така че трябва да го направите в нормален thread. On the other hand, sending a message on Socket can be done via HandlerThread`, защото не блокира като операция за четене. Не съм сигурен какво точно се опитвате да направите, но не виждам защо имате нужда от Looper, за да четете от socket - person iTech; 20.02.2013
comment
За съжаление в нормална активност на android изглежда добре. Въпреки това, аз използвам andengine, така че неговата opengl нишка, така че това е, което причинява проблема. - person NiffyDroid; 20.02.2013