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 непосредственно в вашем сервисе как подкласс.

Бедно это помогает! ура

Другие вопросы по тегам