在Android中使用LoaderManager API加载相关查询的首选方法是什么?到目前为止,我能想到的最好的东西是:
@Override
public void onCreate( Bundle savedInstanceState ) {
getLoaderManager().initLoader( FIRST, null, this );
}
@Override
public void onLoadFinished( Loader<Cursor> loader, Cursor data ) {
switch ( loader.getId() ) {
case FIRST:
Bundle args = new Bundle();
args.putInt( ID, somethingFromData( data ) );
getLoaderManager().restartLoader( SECOND, args, this );
break;
case SECOND:
somethingElseFromData( data );
break;
}
}
大部分时间都可以正常工作,但在一个特殊情况下崩溃可怕。假设我启动了第二个活动或在此基础上推送一个修改FIRST
数据的片段。现在,当我使用上面的代码导航回活动/片段时,首先使用FIRST
和SECOND
的旧数据刷新我,并且FIRST
启动SECOND
,{ {1}}将重新加载新数据。现在,自SECOND
更改后,它会再次加载,这会导致另一个FIRST
加载启动。
首先,如果你计算总计两个SECOND
(一个旧的和一个新的)和三个FIRST
(两个旧的和一个新的)的负载,至少接缝有点浪费。我真的不介意,除了调试很麻烦,但在我看来它也表现得不确定,因为你不知道哪些负载会先完成。如果SECOND
和SECOND
之间的关系发生变化,或者我最终会使用缓存的值,我会最终获得FIRST
的新数据吗?
我知道我可以通过记录何时重启第二个加载器来减轻这种情况,但必须有更好的方法来实现这一点。
稍微澄清一下:如果SECOND
中的行包含对FIRST
中行的引用,并且在后面导航后SECOND
中的行包含了FIRST
中的行,则问题最突出不要像以前那样指向SECOND
中的相同行。