2

这是我的情况。我的应用程序旨在报告不同的活动。具体来说,我有一个表单(片段),用户可以在其中输入数据并保存它。之后,用户可以预览表单(活动)。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

4

0 回答 0