我如何知道是不是调用了 onSaveInstanceState() 以避免 IllegalStateException?

Posted

技术标签:

【中文标题】我如何知道是不是调用了 onSaveInstanceState() 以避免 IllegalStateException?【英文标题】:How do I know if onSaveInstanceState() has been called so that I can avoid the IllegalStateException?我如何知道是否调用了 onSaveInstanceState() 以避免 IllegalStateException? 【发布时间】:2016-02-10 12:26:26 【问题描述】:

当用户在导航抽屉中选择一个项目时,我的应用程序会启动一个处理程序,在等待抽屉关闭后,它会调用代码来替换我的主 Activity 中的片段。但是,如果设备在延迟期间已旋转,我会收到 IllegalStateException。

我已经阅读了这篇关于片段事务和生命周期的精彩文章,但我不确定如何在我的代码中处理这个问题。我知道我不应该在onSaveInstanceState() 之后尝试提交事务。但是我怎么知道onSaveInstanceState() 是否被调用了呢?我想做这样的事情。

navView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() 
    @Override
    public boolean onNavigationItemSelected(final MenuItem menuItem) 
        // close drawers
        drawerLayout.closeDrawers();

        new Handler().postDelayed(new Runnable() 
            @Override
            public void run() 
                goTo(menuItem); // swap in Fragment specified by menuItem
            
        , 300);
        return true;
    
    );
...
private void goTo(menuItem) 
    if( alreadyCalledOnSaveInstanceState()   // THIS
        return;
    

    switch (item.getItemId()) 
        case R.id.item1:
            frag = new Fragment_Grade_Calculator();
            getSupportFragmentManager().beginTransaction().setCustomAnimations(R.anim.slide_in_up, R.anim.zoom_exit).replace(R.id.main_frag_container, frag)
                    .commit();
            return true;

但我不知道与我虚构的alreadyCalledOnSaveInstanceState() 等效。

【问题讨论】:

我最终只是在我的 goTo(menuItem) 电话周围放置了一个 try/catch。它达到了我的目的——片段永远不会被交换。比崩溃好。 【参考方案1】:

我认为你不应该使用 onSaveInstanceState(),而应该使用 onStop()。并且在调用 onStop() 之后不要提交事务。并且不要忘记在 onStart() 被调用后允许提交你的事务。

【讨论】:

你是说我应该手动追踪onSaveInstanceState()onStop()是否被调用? 这篇文章专门针对您的问题:androiddesignpatterns.com/2013/08/…【参考方案2】:

据我所知,onSaveInstanceState() 永远不会在 onPause() 之前被调用。因此,只要您在恢复状态下提交片段事务,就应该避免遇到 IllegalStateException。

【讨论】:

根据文档,在android P之后,onSaveInstanceState保证在onStop之后被调用。但是在 Android P 之前,onSaveInstanceState 会在 onStop 之前调用,并不能保证是在 onPause 之前还是之后发生。 developer.android.com/reference/android/app/…

以上是关于我如何知道是不是调用了 onSaveInstanceState() 以避免 IllegalStateException?的主要内容,如果未能解决你的问题,请参考以下文章

iOS:如何知道 viewDidLoad 是不是被调用?

如何知道是不是通过 require_once() 调用了 php 脚本? [复制]

如何知道 UICollectionView 是不是会在 scrollToItemAtIndexPath: 被调用后实际滚动?

编译器如何知道函数调用中的逗号不是逗号运算符?

检查是不是调用了 WCF 服务

使用`FALLBACK`时如何知道是不是返回左值?