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