在应用程序停止时旋转设备时,将重置AsyncTaskLoader

时间:2015-04-08 00:05:18

标签: android asynctaskloader

我有一个AsyncTaskLoader在一个非常特殊的情况下被重置,并且希望有人可以告诉我原因。

  1. 在我的活动中,我在getSupportLoaderManager().initLoader(0, null, this)方法中调用onCreate()。一切都按预期运行:
  2. D/Activity﹕ calling initLoader()
    D/Activity﹕ onCreateLoader()
    D/Loader﹕ onStartLoading()
    D/Loader﹕ onStartLoading(): no data, forcing load
    D/Loader﹕ loadInBackground()
    D/Activity﹕ onLoadFinished()
    
    1. 但是,如果我对应用程序进行后台处理(点击主页),请旋转设备,然后将其返回到前台,我看到加载程序已重置:
    2. 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中描述的情况下重置它。

      任何人都可以提供任何见解吗?我试图阻止应用程序在有人背景应用程序,旋转设备,然后恢复应用程序的更改中进行不必要的调用。感谢

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回调的实现正确完成。