在一个按钮上点击我想从两个XML文件创建一个新的SQLite数据库。使用LoaderManager和AsyncTaskLoader似乎适合于此。AsyncTaskLoader在旋转后不会调用onLoadFinished()
的Fragment.onCreate()调用:
setRetainInstance(true);
当单击该按钮时,我的代码段将它创建数据库的标志,改变布局以显示进度条和取消按钮,呼叫:
getLoaderManager().initLoader(0, extra, this);
该操作在PC/Emulator上需要12秒。如果我旋转屏幕,加载器继续调用片段的onLoaderProgressUpdate(int)(一种接口回调方法)并完成数据库的创建。但它永远不会调用onLoadFinished()方法,我可以在其中重置布局,启用需要数据库的按钮和操作栏菜单。
我试着在Fragment.onCreateView()这样做:
if (mCreatDBInProgress) {
mBTN_CreateDB.setEnabled(false);
mDBLayout.setVisibility(View.GONE);
mProgressBarLayout.setVisibility(View.VISIBLE);
getLoaderManager().restartLoader(0, null, this);
}
但叫我onCreateLoader()方法,并从头开始整个事情。这是一个问题,因为我没有调用删除数据库的方法,并且经历了确定用于创建数据库的XML文件的过程。 XML文件名是我在Bundle arg中传递给该方法的内容。
我不明白为什么ProgressBar回调方法继续工作,但AsyncTaskLoader无法调用onLoadFinished()方法。 LogCat显示它执行了deliverResult()。
我试图让Bundle成为一个成员变量,所以我可以在restartLoader()调用中重新使用它。它启动另一个asyncTaskLoader,并且当两个线程尝试更新它时,我的ProgressBar会前后移动。最终,它会得到一个SQLConstraintException尝试将一行添加到已由第一个线程添加的数据库中。