4

我有AsyncTaskLoader一个长时间运行的任务,当加载程序运行时,我的活动由于方向变化而被破坏,onLoadFinished不会调用回调。

我可以以某种方式将加载程序“重新附加”到我的新活动/它的回调吗?

这是我的(简化的)活动

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) {

    }
}

}

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

4

3 回答 3

9

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

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

另请参阅加载程序指南

于 2013-05-13T15:13:05.063 回答
1

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

于 2013-05-13T15:12:53.323 回答
-8

添加android:configChanges="orientation|screenSize"到我的活动中对我有用。

于 2013-11-12T23:01:30.963 回答