无法在onSaveInstanceState之后执行此操作-android



我有一个授权应用程序。在该应用程序中,用户具有accessTokenrefreshToken。我做了这样的事情,如果用户在其他硬件上登录,而不是在真正的硬件上,他会自动注销。想象一下,我登录的地方有电话1。现在我登录的是电话2。当我授权我的令牌更改时。所以我在phone1中检查令牌是否发生了更改,而不是自动注销。但有时在注销后,我会遇到这样的错误异常:

java.lang.IollegalStateException:之后无法执行此操作onSaveInstanceState。

这是我在令牌过期时注销的位置。注意,这是

Call<RefreshTokenActivation> newToken = apiClient.newToken(supportObjToken);
newToken.enqueue(new Callback<RefreshTokenActivation>() {
@Override
public void onResponse(Call<RefreshTokenActivation> call, Response<RefreshTokenActivation> response) {
if (response.isSuccessful()) {
} else {
if (response.code() == 401) {
//Perform this call if refresh token is expired
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
Activity activity = (Activity) context;
MainActivity mainActivity = (MainActivity) activity;
mainActivity.logOut();
}
}, 1000);
}
}
}

如果响应为401,则表示我的令牌已过期。如果令牌过期,一秒钟后我会将我的用户抛出到mainActivity

这是MainActivity:中的代码

public class MainActivity extends AppCompatActivity
implements FragmentChangeListener, TabLayoutLocationInterface {
private ConnectionDetector connectionDetector;
private SlidePageTabsMainFragment slidePageTabsMainFragment;
private MainFragment mainFragment;
private RelativeLayout logOut;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SharedPreferencesManager.init(this);
setContentView(R.layout.activity_main);
logOut = (RelativeLayout) findViewById(R.id.list6);
connectionDetector = new ConnectionDetector(this);
slidePageTabsMainFragment = new SlidePageTabsMainFragment();
mainFragment = new MainFragment();
connectionEnable();
userLogOut();
}
public void connectionEnable() {
if (!connectionDetector.isConnected()) {
Toast.makeText(this, "Please check your Internet", Toast.LENGTH_LONG).show();
} else {
Boolean loggedIn = SharedPreferencesManager.getInstance().getUserLogged();
if (loggedIn) {
this.replaceFragment(slidePageTabsMainFragment, true);
} else {
this.replaceFragment(mainFragment, true);
}
}
}
@Override
public void replaceFragment(BaseFragment fragment, Boolean isAddToBackStack) {
String backStateName = fragment.getFragmentName();
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.replace(R.id.main_fragment_container, fragment, backStateName);
transaction.addToBackStack(backStateName);
transaction.commit();
}
@Override
public int getTabLayoutLocation() {
SlidePageTabsMainFragment slidePageTabsMainFragment = (SlidePageTabsMainFragment)
getSupportFragmentManager().findFragmentByTag("SlidePageTabsMainFragment");
if (slidePageTabsMainFragment == null) {
return 0;
}
return slidePageTabsMainFragment.getTabLayoutLocation();
}
//If user click logOut button
public void userLogOut() {
logOut.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SharedPreferencesManager.getInstance().setUserLogin(false);
SharedPreferencesManager.getInstance().removeUser();
getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
replaceFragment(mainFragment, false);
}
});
}

//A function for automatic logOut
public void logOut() {
SharedPreferencesManager.getInstance().setUserLogin(false);
replaceFragment(new MainFragment(), false);
getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
recreate();
SharedPreferencesManager.getInstance().removeUser();
}
@Override
protected void onResume() {
super.onResume();
Log.d("Test", "Text");
}

}

我认为没有什么困难。所以我在MainActivityreplaceFragment()方法中的transaction.commit(); 行中得到了这个异常。在那个调用中,您可以看到我正在调用mainActivity.logOut();,并且在MainActivity中可以看到logOut函数。

//A function for automatic logOut
public void logOut() {
SharedPreferencesManager.getInstance().setUserLogin(false);
replaceFragment(new MainFragment(), false);
getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
recreate();
}

所以在这个方法中,我更改了SharedPreferences值(我需要检查应用程序打开时用户是否登录?(。之后,我将片段替换为mainFragment(这是基础片段,是的,我正在处理片段(。在那之后,我弹出了所有的片段,因为在注销后,如果我点击后退按钮,它就会返回,所以在弹出后,我重新创建了应用程序。重新创建后,感觉就像是第一次打开应用程序。好的,为什么它会抛出这样的异常?知道吗?

使用transaction.commitAllowingStateLoss();而不是transaction.commit();

如果你这样做比你的最终状态不允许保存,但如果你不在乎,这是可以的

有关commit()commitAllowingStateLoss()的更多说明,请阅读本博客。

最新更新