私は 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
メイン (UI) スレッドで何らかの種類のファイル アクセスまたは SQL を使用しようとすると、Android が怒鳴るようになりました。しかし、メイン スレッドでファイル アクセスや SQL を使用することをお勧めします。たとえば、メイン アクティビティは、onCreate()
まだ設定されていない場合に備えて、既定の設定値を内部に読み込む必要があります。
PreferenceManager.setDefaultValues(context, resId, readAgain);
おっと --- がonCreate()
UI スレッドで呼び出されるため、アプリケーションの最初の実行時にファイル アクセスが発生します。これを回避する唯一の方法は、別のスレッドを開始することです。これにより、設定を読み取ってデフォルト値が既に設定されていることを期待する可能性のある他の UI コードとの競合状態が発生します。
DownloadManager などのサービスも考えてください。ダウンロードをキューに入れると、(メイン スレッドで) ダウンロードが完了したことを知らせるイベントが発生します。そのダウンロードに関する情報を実際に取得するには (ダウンロード ID のみが表示されます)、DownloadManager にクエリを実行する必要があります。これにはカーソルが含まれており、厳密なポリシーがオンになっている場合はエラーが発生します。
では、メイン スレッドでカーソルにアクセスしても問題ないのでしょうか。それとも悪いことで、Android 開発チームと Android 書籍の著者の半数がそのことを忘れていたのでしょうか?