Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/187.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android AsyncTaskLoader:方向更改后未调用onLoadFinished_Android - Fatal编程技术网

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

Android AsyncTaskLoader:方向更改后未调用onLoadFinished,android,Android,我有一个AsyncTaskLoader和一个长时间运行的任务,当加载程序运行时,我的活动由于方向更改而被破坏时,不会调用onLoadFinished回调 我能否以某种方式将加载程序“重新连接”到我的新活动/它的回调 以下是我的(简化)活动: public class DashboardActivity extends BaseActivity { StartupCallback startupCallback; boolean loading = false; @Override

我有一个
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) {

    }
}

}
公共类DashboardActivity扩展了BaseActivity{
启动回调启动回调;
布尔加载=假;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.empty_viewpager);
startupCallback=新的startupCallback();
如果(!加载){
getSupportLoaderManager().initLoader(GlobalApp.giveId(),null,
启动(回调);
加载=真;
}
}
私有类回调实现
LoaderManager.LoaderCallbacks{
@凌驾
public void onLoadFinished(加载程序,布尔成功){
Log.d(“Log”,“onload完成”);
}
@凌驾
公共加载器onCreateLoader(int-id,Bundle-args){
返回新的StartupLoader(getApplicationContext());
}
@凌驾
公共void onLoaderReset(加载器){
}
}
}

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

根据文档,只要id与您第一次传递的id相同,它就应该返回当前加载程序,而不是新的加载程序:

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

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


另请参见将android:configChanges=“orientation | screenSize”

添加到我的活动中为我带来了好处

我认为你的问题是重新开始活动。默认情况下,当您更改方向时,android将重新创建活动。为了防止这种添加,请在此处阅读关于android:configChanges的内容:谢谢,但正如您所说,这是默认行为,我不想更改它;停止在方向更改时重新启动活动可能在这里起作用,但在其他地方可能会给我带来麻烦,我可能会遇到同样的问题。您的新StartupLoader看起来怎么样?密码?