0

Fragments があり、すべての Fragment にデータをキャッシュします。サーバーから doInBackground メソッドでダウンロードして AsyncTask にデータをキャッシュし、onPostExecute でデータベースに保存します。そのため、常に onPostExecution でデータベース接続を開きます。「高速」にスクロールしてフラグメントをスローすると、AsyncTasks がプレビュー インスタンスを通過しandroid.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:224)、接続を開く行に があると思います (getting dbHelper.getWritableDatabase())

これを解決するには、次の 2 つの方法があると思います。

  • onPostExecution メソッドは、プレビュー AsyncTask (onPostExecution) が終了するまで待機する必要があります

  • AsyncTask のすべてのインスタンスに対して、それらを相互にロックすることなく、同じデータベース接続を使用する方法があります。

これは正しいです?誰かアイデア、これを行う方法は?

4

2 に答える 2

6

バックグラウンドでデータをロードするには、AsyncTask の代わりに Loader を使用することをお勧めします。それ以外の場合は、カーソルを管理し、UI スレッドと正しく同期し、すべてのクエリがバックグラウンド スレッドで発生するようにする必要があります。さらに、非推奨になった startManagingCursor および managedQuery メソッドを使用することは、非常に推奨されていません。アプリの速度が低下し、アプリが急停止する可能性があります。

Android 3.0 では、プロセスを簡素化するためにLoader クラスと LoaderManagerクラスが導入されました。どちらのクラスも、Android サポート ライブラリで使用できます。このライブラリは、Android 1.6 までのすべての Android プラットフォームをサポートしています。

ローダーは、すべてのカーソル操作非同期で行われるようにするため、UI スレッドをブロックする可能性を排除します。さらに、LoaderManager によって管理される場合、ローダーはアクティビティ インスタンス全体で既存のカーソル データを保持するため (たとえば、画面の回転によって再起動された場合)、不要でコストがかかる可能性のある再クエリからカーソルを節約できます。追加のボーナスとして、ローダーは基になるデータ ソースの更新を監視するのに十分なほどインテリジェントであり、データが変更されたときに自動的に再クエリを実行します。

ローダーの詳細については、このブログを ご覧ください http://www.androiddesignpatterns.com/2012/07/understanding-loadermanager.html

または、Android 開発者向けの公式ドキュメントにアクセスしてください: http://developer.android.com/guide/components/loaders.html

于 2013-05-28T15:51:22.170 に答える
2

あなたが探しているすべての情報は、この投稿で見つけることができると思います。

Android での SQLite のベスト プラクティスは何ですか?

データベースにデータを保存するための onPostExecution の使用に関しては、SQLiteDatabase クラスはスレッド セーフであるため、doInBackground メソッドで実行すると、アプリケーションが高速になります (それでも安全です)。

データの保存が複数の sql クエリで構成されている場合、トランザクションを使用することで、それらがアトミックに (他のスレッドの干渉なしに) 実行されることを簡単に保証できることに注意してください。

Android 開発者向け Web サイトの SQLiteDatabase の beginTransaction()

とにかくどちらを使用する必要がありますか(1回のトランザクションで1000行を挿入すると、処理が大幅に高速化されます)

お役に立てれば

于 2013-05-28T15:16:20.160 に答える