Соответствует ли SQL или общий доступ к файлам в основном потоке пользовательского интерфейса Android? - PullRequest
6 голосов
/ 30 ноября 2011

Я пытаюсь следовать рекомендациям Android, поэтому в режиме отладки я включаю все следующее:

StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectAll().penaltyLog().build()); //detect and log all thread violations
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectAll().penaltyLog().build()); //detect and log all virtual machine violations

Android теперь кричит на меня, когда я пытаюсь использовать любой вид доступа к файлам или SQL в основном потоке (UI). Но я вижу так много рекомендаций по использованию доступа к файлам и / или SQL в основном потоке. Например, основное действие должно загружать значения предпочтений по умолчанию внутри onCreate(), если они еще не установлены:

PreferenceManager.setDefaultValues(context, resId, readAgain);

Упс --- это приводит к доступу к файлу при первом выполнении приложения, потому что onCreate() вызывается в потоке пользовательского интерфейса. Единственный способ обойти это, как я вижу, - запустить отдельный поток, который вводит условие гонки с другим кодом пользовательского интерфейса, который может считывать настройки и ожидать, что значения по умолчанию уже установлены.

Подумайте также о таких службах, как DownloadManager. (На самом деле, он настолько глючит, что бесполезен в реальной жизни, но давайте представим, что он работает на секунду.) Если вы ставите очередь на скачивание, вы получаете событие (в главном потоке), сообщающее, что загрузка завершена. Чтобы на самом деле получить информацию об этой загрузке (она дает только идентификатор загрузки), вам нужно запросить DownloadManager - который включает курсор, который выдает ошибку, если у вас включена строгая политика.

Так в чем же история - нормально ли обращаться к курсорам в главном потоке? Или это плохо, и половина команды разработчиков Android и авторов книг Android забыли об этом?

1 Ответ

8 голосов
/ 30 ноября 2011

Единственный способ обойти это, я вижу, это запустить отдельный поток - который вводит условие гонки с другим кодом пользовательского интерфейса, который может считывать предпочтения и ожидать, что значения по умолчанию уже установлены.

Затем используйте AsyncTask, поместив вызов setDefaultValues() в doInBackground() и "другой код пользовательского интерфейса, который может прочитать настройки" в onPostExecute().

.чтобы получить информацию об этой загрузке (она дает только идентификатор загрузки), вам нужно запросить DownloadManager, в котором есть курсор, сообщающий об ошибке, если включена строгая политика.

Итак, запросите DownloadManager в фоновом потоке.

Так в чем же история - нормально ли обращаться к курсорам в главном потоке?

Чтозависит от вашего определения «отлично».

На устройствах Android 1.x и 2.x используется файловая система YAFFS2, которая в основном сериализует весь доступ к диску во всех процессах.Чистый эффект состоит в том, что, хотя ваш код может казаться достаточно производительным в отдельности, иногда он кажется медленным в процессе производства из-за других вещей, происходящих в фоновом режиме (например, загрузка новой электронной почты).

Хотя это немногоменьше проблем в Android 3.x и выше (они переключились на ext4), нет сомнений в том, что флэш-ввод-вывод все еще относительно медленный - он будет немного более предсказуемо медленным.

StrictMode предназначен для указания, где может возникнуть вялость.Вам решать, какие из них являются доброкачественными, а какие - нет.В идеальном мире вы бы очистили их всех;в идеальном мире у меня были бы волосы.

Или это плохо, и половина команды разработчиков Android и авторов книг Android забыли об этом?

Это всегда было «плохо».

Я не могу говорить за «половину команды разработчиков Android».Я предполагаю, что на раннем этапе они ожидали, что разработчики применят свой опыт разработки для обнаружения вялого поведения - это существенно не отличается от проблем производительности на любой другой платформе.Со временем они предлагали больше шаблонов, чтобы направлять разработчиков в позитивном направлении (например, Loader framework), в дополнение к изменениям на уровне системы (например, YAFFS2-> ext4), чтобы уменьшить эту проблему.Частично они пытаются адресовать места, где Android представляет различные проблемы, связанные с производительностью, такие как однопоточный пользовательский интерфейс.

Точно так же я не могу говорить за всех авторов книг Android.Я, конечно, не фокусировался на проблемах производительности в ранних выпусках моих книг, так как фокусировался на функциях и функциях Android.Со временем я добавил больше советов в этих областях.Я также предоставил открытый исходный код, связанный с этими темами.В 2012 году я внесу массивные изменения в свои книги и создам больше проектов с открытым исходным кодом, чтобы продолжить решение этих проблем.Я подозреваю, учитывая ваш тон, что я (и, возможно, другие) в ваших глазах полностью провалился, и вы, безусловно, приветствуете ваше мнение.

...