AsyncTaskLoader:在方向更改后未调用onLoadFinished

时间:2013-05-08 11:52:05

标签: android

我有一个AsyncTaskLoader有一个长时间运行的任务,当加载程序运行时,我的活动因方向更改而被销毁,onLoadFinished回调未被调用。

我可以以某种方式'重新附加'加载器到我的新Activity /它的回调吗?

这是我的(简化)活动

public class DashboardActivity extends BaseActivity {

StartupCallback startupCallback;
    boolean loading = false; 

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.empty_viewpager);
    startupCallback = new StartupCallback();

    if (!loading){
         getSupportLoaderManager().initLoader(GlobalApp.giveId(), null,
                startupCallback);
                 loading = true; 
    }
}


private class StartupCallback implements
        LoaderManager.LoaderCallbacks<Boolean> {
    @Override
    public void onLoadFinished(Loader<Boolean> loader, Boolean succ) {

        Log.d("LOG", "onLoadFinished"); 
    }

    @Override
    public Loader<Boolean> onCreateLoader(int id, Bundle args) {

        return new StartupLoader(getApplicationContext());
    }

    @Override
    public void onLoaderReset(Loader<Boolean> loader) {

    }
}

}

我不能只使用新的回调启动另一个加载器,因为加载器会执行数据库操作,并且在同一个数据库上运行的两个加载器会使应用程序崩溃。

3 个答案:

答案 0 :(得分:9)

在方向更改期间,您的活动将被销毁并重新创建,但装载程序不会。

值得注意的是,对initLoader()的调用不一定启动另一个加载器。 如果存在由特定ID处理的加载程序,则LoaderManager将重用并将您的回调重新附加到它。因此,您可以删除(!加载)条件,并在每个 onCreate()回调中调用initLoader。只需确保加载程序的ID是相同的。

另见Loader guide

答案 1 :(得分:1)

从文档中,只要id与您首次传递的id相同,它就应该返回当前的加载器而不是新的加载器:android docs

答案 2 :(得分:-8)

为我的活动添加android:configChanges="orientation|screenSize"对我来说是个窍门。