AsyncTaskLoader:方向更改后未调用onLoadFinished

4

我有一个AsyncTaskLoader,其中包含一个长时间运行的任务。当我的Activity因方向更改而被销毁时,onLoadFinished回调函数不会被调用。

我能否将加载器“重新附加”到我的新Activity / 它的回调上?

这是我的(简化后的)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) {

    }
}

}

我不能只用新的回调函数启动另一个加载程序,因为该加载程序会涉及到数据库操作,两个加载程序同时操作同一数据库会导致应用程序崩溃。


我认为你的问题是重新启动活动。默认情况下,当您更改方向时,Android会重新创建活动。要防止这种情况,请添加有关android:configChanges的信息,请参见此处:http://developer.android.com/guide/topics/manifest/activity-element.html - Alexander Mikhaylov
谢谢,但正如你所说,这是默认行为,我不想改变它;停止Activity在方向更改时重新启动可能在这里起作用,但会给我带来其他麻烦,在那里我可能会遇到同样的问题。 - fweigl
你的新的StartupLoader代码是什么样子? - drdrej
3个回答

9
在屏幕方向改变时,您的Activity会被销毁并重新创建,但是加载器不会被销毁。
值得注意的是,调用initLoader()并不一定会开始另一个加载器。如果特定ID对应的加载器已经存在,则它会被LoaderManager 重用,并且您的回调函数会重新附加到它上面。因此,您可以删除(!loading)条件,并在每个onCreate()回调中调用initLoader()。只需确保加载器的ID相同即可。
另请参见加载器指南

1
根据文档,只要id与首次传递的相同,它应该返回当前加载程序而不是新的加载程序: android docs

-8
android:configChanges="orientation|screenSize"添加到我的活动中,对我很有帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接