Приложение Android NonUI Thread, создающее потоки, «не отвечает»
-
12-12-2019 - |
Вопрос
Я редактирую код приложения для Android, которое выполняет вызовы GPS в службе.Слушатель местоположения.Он также использует ServiceConnection
В некоторых представлениях устройство решает, что моему приложению требуется слишком много времени для ответа, и что пользователь может либо «Принудительно закрыть», либо «Подождать».До появления этого всплывающего окна пользователь все еще может использовать приложение: он может прокручивать, перемещать, нажимать кнопки и т. д.
Я только предполагаю, что это связано со службой GPS, поскольку она запускается всякий раз, когда возникает эта проблема.
Я слышал, что эта проблема связана с потоком, работающим в UIthread, а не с фоновым потоком.Но я был уверен, что сервисы работают асинхронно в фоновом потоке.
Понимание оценено
Решение
Использование службы не обязательно порождает новый поток, вызов службы выполняется в потоке вызывающего объекта.Из документа службы API Android по адресу:«Обратите внимание, что службы, как и другие объекты приложения, выполняются в основном потоке своего хост-процесса..».
Вы можете указать службу для запуска в другом процессе, но лучше всего создать новый поток в службе.
Подробнее о сервисе Android:http://developer.android.com/reference/android/app/Service.html
Другие советы
Я полностью рекомендую вам расширить AsyncTask, это позволит правильно и легко использовать поток пользовательского интерфейса.Позволяет выполнять фоновые операции и публиковать результаты в потоке пользовательского интерфейса без необходимости манипулировать потоками и/или обработчиками.Возможно, вы захотите выполнить все вычисления в методе doInBackground. Кстати. Принудительно закрыть или подождать это классическое поведение для такого рода проблем.Удачи!!!
Обработка в службе по-прежнему может привести к зависанию вашего приложения.
Решение, которое вам следует рассмотреть, — это запускать любую логику, которая может затормозить вашу деятельность, в отдельном потоке.Сюда входят такие вещи, как:Обновления/вставки баз данных, сетевое взаимодействие и любые другие фрагменты долго работающего кода.
AsyncTask — удобный метод для этого, поскольку вы можете управлять пользовательским интерфейсом с помощью функций onPreExecute и onPostExecute.
Вы можете реализовать AsyncTask непосредственно в своем сервисе в качестве подкласса.
Надеюсь, это поможет!Ваше здоровье