Соответствует ли SQL или общий доступ к файлам в главном потоке пользовательского интерфейса Android?

Я пытаюсь следовать рекомендациям 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)

Ваш ответ на вопрос