ContentProvider
SQLiteデータベースへのアクセスを管理するカスタムがあります。データベーステーブルのコンテンツをにロードするには、aと:ListFragment
を使用します。LoaderManager
CursorLoader
CursorAdapter
public class MyListFragment extends ListFragment implements LoaderCallbacks<Cursor> {
// ...
CursorAdapter mAdapter;
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mAdapter = new CursorAdapter(getActivity(), null, 0);
setListAdapter(mAdapter);
getLoaderManager().initLoader(LOADER_ID, null, this);
}
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
return new CursorLoader(getActivity(), CONTENT_URI, PROJECTION, null, null, null);
}
public void onLoadFinished(Loader<Cursor> loader, Cursor c) {
mAdapter.swapCursor(c);
}
public void onLoaderReset(Loader<Cursor> loader) {
mAdapter.swapCursor(null);
}
}
ContentProvider
SQLiteデータベースは、Webサービスから多数のアイテムをフェッチし、バッチ操作( )を介してこれらのアイテムをデータベースに挿入するバックグラウンドタスクによって更新されますContentResolver#applyBatch()
。
これがバッチ操作であっても、ContentProvider#insert()
行ごとに呼び出されるgetsはデータベースに挿入され、現在の実装では、挿入コマンドごとにContentProvider
呼び出されます。setNotificationUri()
その結果CursorAdapter
、通知のバーストを受信し、UIが頻繁に更新されて、結果として迷惑なちらつき効果が発生します。
理想的には、バッチ操作が進行中の場合、ContentObserver
各挿入コマンドではなく、バッチ操作の最後にのみ通知する方法が必要です。
これが可能かどうか誰かが知っていますか?ContentProvider
実装を変更して、そのメソッドをオーバーライドできることに注意してください。