我有一个AsyncTaskLoader在一个非常特殊的情况下被重置,并且希望有人可以告诉我原因。
getSupportLoaderManager().initLoader(0, null, this)
方法中调用onCreate()
。一切都按预期运行:D/Activity﹕ calling initLoader()
D/Activity﹕ onCreateLoader()
D/Loader﹕ onStartLoading()
D/Loader﹕ onStartLoading(): no data, forcing load
D/Loader﹕ loadInBackground()
D/Activity﹕ onLoadFinished()
D/Activity﹕ onLoaderReset()
D/Activity﹕ calling initLoader()
D/Activity﹕ onCreateLoader()
D/Loader﹕ onStartLoading()
D/Loader﹕ onStartLoading(): no data, forcing load
D/Loader﹕ loadInBackground()
D/Activity﹕ onLoadFinished()
当应用程序发送到后台并恢复(以相同方向)时,加载程序不会重置,并且在应用程序位于前台时旋转设备时不会重置加载程序。因此,我不希望在#2中描述的情况下重置它。
任何人都可以提供任何见解吗?我试图阻止应用程序在有人背景应用程序,旋转设备,然后恢复应用程序的更改中进行不必要的调用。感谢
答案 0 :(得分:0)
有时,设备会销毁某个活动,然后在用户返回时将其恢复。您需要在重新创建状态时恢复状态。如果您需要保存变量,则需要覆盖此方法:
@Override
public void onSaveInstanceState (Bundle outState) {
// save you variables
outState.putInt("myInt", myInt);
}
因此,当重新创建活动时,您将检查savedInstanceState是否为null。如果为null,则可以照常初始化,否则可以恢复状态。对于你的情况,如果savedInstanceState不为null,你就不会初始化加载器
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if(savedInstanceState != null) {
// restore state
} else {
// init your loader
}
}
答案 1 :(得分:0)
这个问题仍然存在,所以这是我的答案。我尝试了你的usecase(2),我的AsyncTaskLoader没有重置。请注意,我正在覆盖回调以保存应用程序实例状态。
如果您已正确初始化加载程序,我怀疑您可能没有保存应用程序实例状态。 当您将应用程序发送到后台时,这表明Android系统可能会破坏您的应用程序。即使它被暂停,Android系统也可以根据系统的资源,当前负载和许多其他条件做出决定,以将其从暂停状态移动到停止状态并释放资源。这就是你的情况可能发生的事情。
无论如何,这是我如何使用加载器功能。有initLoader()和restartLoader()。
使用initLoader(),您需要在调用它之前进行检查,并使用restartLoader(),您需要将Bundle传递给调用。
所以
if(getSupportLoaderManager().getLoader(0) != null)
{
getSupportLoaderManager.initLoader(0,null,this);
}
并重新开始
Bundle mybundle = new Bundle();
mybundle.putString("somekey", "someval");
getSupportLoaderManager.restartLoader(0,mybundle,this);
我假设AsyncTaskLoader设置并且Loader回调的实现正确完成。