在Fragment中的后台线程中保存后,SQLiteCursorLoader不刷新Activity中的数据

时间:2013-07-18 11:57:10

标签: android android-asynctask android-cursorloader

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

我阅读了许多how -o-articles,但其中大多数都涉及ListView中适配器中使用的一个CursorLoader的情况。

我是否错误地使用了SQliteCursorLoader?

我尝试在onStop()中销毁Lader但没有。也许它不是CursorLoader。

也许我错误地使用了AsyncTask?

任何信息,帮助,批评,特别是如何发挥它,非常感谢。

编辑:

好的,我发现加载程序会更新数据,只要它自己插入/更新/替换/删除数据。所以另一个问题提出了:

如何在活动之间交换装载机?

好的,我在这里找到答案: Global Loader (LoaderManager) for reuse in multiple Activities / Fragments

0 个答案:

没有答案