SQLite
 sql >> база данни >  >> RDS >> SQLite

IntentService блокира потребителския интерфейс на моето приложение

Абсолютно ли сте сигурни, че това е IntentService това е основната причина за замръзването на потребителския интерфейс? Услугите за намерение са специално проектирани да работят в работни нишки, за да разтоварят обработката от основната (UI) нишка, като една от основните причини за това е да помогнат за предотвратяване Потребителският интерфейс замръзва.

Може би опитайте да започнете усилията си за отстраняване на грешки на ниво потребителски интерфейс. По-специално това, което предоставя ResultReceiver към IntentService когато го стартирате и какво правите в onReceiveResult метод за обратно извикване в този екземпляр на приемника?

Освен това, за дейността, в която изпитвате замръзване, проверете какъв вид операции предприемате. Зареждане на големи количества данни от база данни в основната нишка (т.е. без използване на Loader или нещо подобно за разтоварване на обработката към работна нишка) е често срещана причина за замръзване на потребителския интерфейс, поне според моя опит досега.

Актуализиране

Мисля, че разбрах какъв е проблема. Има два основни проблема, и двата произтичат от начина, по който използвате Volley. Когато добавите заявка към опашката Volley, тя се изпълнява асинхронно. Това означава, че queue методът се връща незабавно. Във вашия код на услугата за намерение това означава, че услугата незабавно продължава да съобщава на ResultReceiver че е завършил обработката, когато всъщност всичко, което е направил, е да постави заявката на опашка. И петте услуги за намерение ще направят това, което означава, че MainActivity ще бъдат въведени много бързо. Това е първият проблем.

Вторият проблем обяснява замръзването, което изпитвате. Въпреки че Volley изпълнява заявки върху работни нишки, той връща анализираните отговори на заявки в основната нишка - вижте документацията тук. Това означава, че цялата обработка на отговора, която извършвате в услугата за намерение (поставяне на данните в базата данни и т.н.), всъщност се случва в основната (UI) нишка. Това обяснява замръзването.

Това, което вероятно искате да направите тук, е да преминете към използването на RequestFuture на Volley вместо. Това основно превръща асинхронна заявка в синхронна, като ви позволява да блокирате, докато заявката приключи. За да направите това, създайте бъдеще от подходящия тип (JSONObject във вашия случай) и го задайте както като слушател, така и като слушател на грешка за заявката. След това поставете заявката на опашка, както правите сега, и веднага след това извикайте get метод за бъдещето. Този метод ще блокира, докато отговорът не завърши обработката. Добре е да направите това в услуга за намерение, защото тя работи върху работна нишка, а не в нишката на потребителския интерфейс.

Ако заявката бъде успешна, ще получите върнатите данни и можете да изпълните цялата логика, която в момента е във вашия Response.Listener изпълнение. Ако възникне грешка (т.е. заявката е неуспешна по някаква причина), бъдещата заявка ще изведе изключение, което можете да обработвате, за да предприемете подходящи действия.

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

Надявам се това да помогне и моите искрени извинения, че не открих грешката по-рано.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Затворено изключение за Android SQLite

  2. изтрийте базата данни sqlite при актуализиране на нова версия на приложението

  3. Причинено от:android.database.sqlite.SQLiteException:няма такава таблица:(код 1) Android

  4. Как да създадете приложение за офлайн интернационализация:Изградете структурата на проекта

  5. Вградената връзка в Android Room игнорира условието на SQL where