这是我的情况。我的应用程序旨在报告不同的活动。具体来说,我有一个表单(片段),用户可以在其中输入数据并保存它。之后,用户可以预览表单(活动)。PreviewActivity 使用 SQLiteCursorLoader。在 PreviewActivity 中,用户可以切换到 FormActivity 以更改以前在 Form Fragment 中输入的数据。它由 startActivityForResult() 调用。之后,保存过程开始,它依赖于调用 AsyncTask 来处理 doInBackground() 方法中的数据库插入/更新。UI Thread 遵循进一步的指令,在 FormActivity 中设置 Result 并关闭 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 后数据不刷新?
我阅读了许多 howTo 文章,但其中大多数都涉及在 ListView 的适配器中使用一个 CursorLoader 的情况。
我是否错误地使用了 SQliteCursorLoader?
我尝试在 onStop() 中销毁Loader,但没有。也许它不是 CursorLoader。
也许我错误地使用了 AsyncTask?
非常感谢任何信息、帮助、批评,尤其是如何解决它。
编辑:
好的,我发现加载器会更新数据,只要它自己插入/更新/替换/删除数据。于是又提出了一个问题:
如何在活动之间交换加载器?
好的,在这里我找到了答案: Global Loader (LoaderManager) for reuse in multiple Activities / Fragments