gpt4 book ai didi

android - 在 Activity 的 onStop() 期间删除 fragment

转载 作者:太空宇宙 更新时间:2023-11-03 13:25:20 25 4
gpt4 key购买 nike

在我的一个应用程序中,我试图实现以下逻辑:

1) 在 Activity 的 onStart() 期间启动一些网络操作并添加进度 fragment :

@Override
protected void onStart() {
super.onStart();
refreshData();
}

private void refreshData() {
if (!isInProgress)
{
showSpinner();
}
//Do boring network request
.......
}

private void showSpinner() {
getSupportFragmentManager().beginTransaction()
.add(new ProgressFragment(), "").addToBackStack("")
.commitAllowingStateLoss();
}

private void hideSpinner() {
getSupportFragmentManager().popBackStack();
}

2) 在 onStop() 期间 - 取消 Activity 网络操作(如果有)并停止进度条(如果正在运行):

@Override
protected void onStop() {
if (isInProgress) {
//cancel network op
....
hideSpinner();
}
super.onStop();
}

3) 在 onSaveInstanceState() 期间保存一些 UI 状态:

@Override
protected void onSaveInstanceState(Bundle outState) {
outState.putInt("tab", getActionBar().getSelectedNavigationIndex());
super.onSaveInstanceState(outState);
}

所以,问题是 onSaveInstanceState()onStop() 之前被调用,所以当我尝试删除进度条时 - 我得到了 java.lang. lang.IllegalStateException: 在 onSaveInstanceState 异常之后无法执行此操作

显然我在 Activity<->Fragment 交互中缺少一些基本的东西,那么处理我的用例的正确方法是什么?

最佳答案

总体建议是避免提交事务以响应异步事件。参见 this article想要查询更多的信息。然而,有时这是不可避免的,您可以设置一些更复杂的状态检查和恢复。

对于您的特定情况(您似乎希望网络请求在 Activity 不再可见时立即停止),您可以为此做一些事情:

public class SampleActivity extends FragmentActivity {
private static final String PROGRESS_FRAGMENT = "progress_fragment";

@Override
protected void onStart() {
super.onStart();
refreshData();
}

private void refreshData() {
if (!isInProgress) {
isInProgress = true;
showSpinner();
}
}

private void cancelRefresh() {
if (isInProgress) {
isInProgress = false;
//cancel request
hideSpinner();
}
}

private void showSpinner() {
getSupportFragmentManager()
.beginTransaction()
.add(new ProgressFragment(), PROGRESS_FRAGMENT)
.commit();
}

private void hideSpinner() {
FragmentManager mgr = getSupportFragmentManager();
Fragment spinner = mgr.findFragmentByTag(PROGRESS_FRAGMENT);
if (spinner != null) {
mgr.beginTransaction()
.remove(spinner)
.commit();
}
}

@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
cancelRefresh();
}

@Override
protected void onStop() {
super.onStop();
cancelRefresh();
}
}

因为您不知道 onSaveInstanceState() 会被调用,您可以在 onSaveInstanceState()onStop() 上调用取消>。设置标志和跟踪 fragment 的标签后,它只会执行一次,应该是安全的。

关于android - 在 Activity 的 onStop() 期间删除 fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21270847/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com