Абсолютно ли сте сигурни, че това е IntentService
това е основната причина за замръзването на потребителския интерфейс? Услугите за намерение са специално проектирани да работят в работни нишки, за да разтоварят обработката от основната (UI) нишка, като една от основните причини за това е да помогнат за предотвратяване Потребителският интерфейс замръзва.
Може би опитайте да започнете усилията си за отстраняване на грешки на ниво потребителски интерфейс. По-специално това, което предоставя ResultReceiver
към IntentService
когато го стартирате и какво правите в onReceiveResult
метод за обратно извикване в този екземпляр на приемника?
Освен това, за дейността, в която изпитвате замръзване, проверете какъв вид операции предприемате. Зареждане на големи количества данни от база данни в основната нишка (т.е. без използване на Loader
или нещо подобно за разтоварване на обработката към работна нишка) е често срещана причина за замръзване на потребителския интерфейс, поне според моя опит досега.
Актуализиране
Мисля, че разбрах какъв е проблема. Има два основни проблема, и двата произтичат от начина, по който използвате Volley. Когато добавите заявка към опашката Volley, тя се изпълнява асинхронно. Това означава, че queue
методът се връща незабавно. Във вашия код на услугата за намерение това означава, че услугата незабавно продължава да съобщава на ResultReceiver
че е завършил обработката, когато всъщност всичко, което е направил, е да постави заявката на опашка. И петте услуги за намерение ще направят това, което означава, че MainActivity
ще бъдат въведени много бързо. Това е първият проблем.
Вторият проблем обяснява замръзването, което изпитвате. Въпреки че Volley изпълнява заявки върху работни нишки, той връща анализираните отговори на заявки в основната нишка - вижте документацията тук. Това означава, че цялата обработка на отговора, която извършвате в услугата за намерение (поставяне на данните в базата данни и т.н.), всъщност се случва в основната (UI) нишка. Това обяснява замръзването.
Това, което вероятно искате да направите тук, е да преминете към използването на RequestFuture
на Volley вместо. Това основно превръща асинхронна заявка в синхронна, като ви позволява да блокирате, докато заявката приключи. За да направите това, създайте бъдеще от подходящия тип (JSONObject
във вашия случай) и го задайте както като слушател, така и като слушател на грешка за заявката. След това поставете заявката на опашка, както правите сега, и веднага след това извикайте get
метод за бъдещето. Този метод ще блокира, докато отговорът не завърши обработката. Добре е да направите това в услуга за намерение, защото тя работи върху работна нишка, а не в нишката на потребителския интерфейс.
Ако заявката бъде успешна, ще получите върнатите данни и можете да изпълните цялата логика, която в момента е във вашия Response.Listener
изпълнение. Ако възникне грешка (т.е. заявката е неуспешна по някаква причина), бъдещата заявка ще изведе изключение, което можете да обработвате, за да предприемете подходящи действия.
Използването на фючърси на заявки е доста различен подход за използване на слушатели и може да се наложи да промените кода си доста, за да го накарате да работи, но това трябва да разреши проблемите, които виждате.
Надявам се това да помогне и моите искрени извинения, че не открих грешката по-рано.