Подходит ли 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);

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

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

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

6
задан Garret Wilson 18 April 2013 в 23:51
поделиться