これが私の状況です。私のアプリは、さまざまなアクティビティを報告することを目的としています。具体的には、ユーザーがデータを入力して保存できるフォーム(フラグメント)があります。その後、ユーザーはフォーム (アクティビティ) をプレビューできます。PreviewActivity は SQLiteCursorLoader を使用します。PreviewActivity にいるユーザーは、Form Fragment に以前に入力したデータを変更するために FormActivity に切り替えることができます。startActivityForResult() によって呼び出されます。その後、保存プロセスが開始され、 doInBackground() メソッドでデータベースへの挿入/更新を処理する AsyncTask の呼び出しに依存します。UI スレッドはさらに指示に従い、Result を FormActivity に設定して FormActivity を閉じます。onActivityresult() メソッドの PreviewActivity では、LoaderManager で restartLoader() メソッドを呼び出します。いくつかのローダー (実際には 9 つ) を再起動する必要があるため、私の状況はまったく異なります。これは、データベース アーキテクチャの結果です。onLoadFinished() メソッドでロードするたびに、コントローラーを呼び出してビューのさまざまなセクションを更新します。問題は、データが更新されないことです。問題を視覚化するためのサンプルコードの下:
startActivityForResult(new Intent(this, FormActivity.class), REQUEST_CODE);
FormActivity でフォームに入力した後:
save() {
new MyAsyncTaskFormSaver().execute(); //saving data
finish();
}
再び PreviewActivity で:
@Override
protected void onCreate() {//here I also use restartLoader()
super.onCreate();
restartLoader();
}
void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == REQUEST_CODE) {
restartLoaders();
}
}
void restartLoaders() {
final LoaderManager loaderManager = getLoaderManager();
loaderManager.restartLoader(1, null, this);
loaderManager.restartLoader(2, null, this);
loaderManager.restartLoader(3, null, this);
loaderManager.restartLoader(4, null, this);
loaderManager.restartLoader(5, null, this);
loaderManager.restartLoader(6, null, this);
loaderManager.restartLoader(7, null, this);
loaderManager.restartLoader(8, null, this);
loaderManager.restartLoader(9, null, this);
loaderManager.restartLoader(10, null, this);
}
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
switch(loader.getId()) {
case 1:
mController.populateView1(data, PreviewActivity.this);
break;
case 2:
mController.populateView2(data, PreviewActivity.this);
break;
case 3:
mController.populateView3(data, PreviewActivity.this);
break;
case 4:
mController.populateView4(data, findViewById(R.id.view4));
break;
case 5:
mController.populateView5(data,findViewById(R.id.view5));
break;
case 6:
mController.populateView6(data, findViewById(R.id.view6));
break;
case 7:
mController.populateView7(data, findViewById(R.id.view7));
break;
case 8:
mController.populateView8(data, findViewById(R.id.view8));
break;
case 9:
mController.populateView9(data, findViewById(R.id.view9), getSupportFragmentManager());
break;
case 10:
mController.populateView10(data, findViewById(R.id.view10), getSupportFragmentManager());
break;
default:
throw new IllegalArgumentException(TAG + ": unknown data Id in onLoadFinished method. Id = " + loader.getId());
}
いくつかの入力メソッドでは、ユーザーが写真のプレビューを表示するボタンをクリックした場合にダイアログを表示するために SupportfragmentManager が必要ですが、それは関連していません。
私の質問は:
保存して PreviewActivity に切り替えた後、データが更新されないのはなぜですか?
私は多くのハウツー記事を読みましたが、それらのほとんどは、ListView のアダプターで使用される 1 つの CursorLoader の状況に関係しています。
SQliteCursorLoader を間違って使用していますか?
onStop() で destroyingLoader を試しましたが、何もしませんでした。CursorLoader ではない可能性があります。
多分私は AsyncTask を間違って使用していますか?
情報、ヘルプ、批判、特にそれを解決する方法を教えてください。
編集:
わかりました、ローダーがデータを挿入/更新/置換/削除する場合、ローダーはデータを更新することがわかりました。したがって、別の質問が発生します。
アクティビティ間でローダーを交換する方法は?
わかりました、ここで答えを見つけました: 複数のアクティビティ/フラグメントで再利用するためのグローバルローダー(ローダーマネージャー)