2013-10-23 31 views
0

在一个按钮上点击我想从两个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尝试将一行添加到已由第一个线程添加的数据库中。

回答

0

好吧,吸我侧身!我想出了一个更好的主意,它起作用了!

取而代之的是旋转后调用restartoader()的,只要致电:

getLoaderManager().initLoader(0, mExtra, this); 

对(其他)的原因,引起AsynTaskLoader只是继续与第一线(而不是启动另一个),并重新连接到我的碎片用于onLoadFinished()调用。

所以:

initLoader() - 重新连接加载到你的片段如果用相同的参数(int, Bundle, this)调用它。

相关问题