3

При сбое приложения, когда я нахожусь в RPC сервера, и когда выполняется RPC, я помещаю приложение в фоновом режиме. Между тем, когда RPC получает ответ от сервера, он выдает фрагмент из стека. При появлении фрагмента приложение сбой. Я читал о создании WeakReference, который будет null, если действие будет уничтожено. Но не уверен, как реализовать это в этом случае.Сбой приложения в фоновом режиме при появлении фрагмента из стека

Ниже мой код:

private void showFragment(SherlockFragment fragment) { 
    FragmentManager fm = getSupportFragmentManager(); 
    fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); 
    FragmentTransaction ft = fm.beginTransaction(); 
    ft.replace(R.id.content, fragment); 
    ft.commit(); 
} 

Я получаю сбой при выполнении следующей строки:

fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);

StackTrace:

01-15 16:37:44.435: E/AndroidRuntime(28049): FATAL EXCEPTION: main 
01-15 16:37:44.435: E/AndroidRuntime(28049): java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState 
01-15 16:37:44.435: E/AndroidRuntime(28049): at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1299) 
01-15 16:37:44.435: E/AndroidRuntime(28049): at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1310) 
01-15 16:37:44.435: E/AndroidRuntime(28049): at android.support.v4.app.FragmentManagerImpl.popBackStack(FragmentManager.java:452) 
01-15 16:37:44.435: E/AndroidRuntime(28049): at com.druva.inSync.ValidationActivity$2.run(ValidationActivity.java:93) 
+1

поиска 'Не удается выполнить это действие после onSaveInstanceState', вы получите много много ответа, –

+0

или просто следить за вопросы, связанные с –

+0

я проверить соответствующие вопросы. Я попытался использовать «commitAllowingStateLoss», я также попытался проверить «activity.isFinishing». Элемент управления не переходит в «isFinishing», и поскольку я получаю сбой перед ft.commit(), commitAllowingStateLoss тоже не помогает. –

ответ

1

У меня была точно такая же проблема , который я решил использовать флаг. Это может показаться немного «Hacky», но это делает работу

public abstract class PopActivity extends Activity { 

    private boolean mVisible; 

    @Override 
    public void onResume() { 
     super.onResume(); 
     mVisible = true; 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     mVisible = false; 
    } 

    private void popFragment() { 
     if (!mVisible) { 
      return; 
     } 

     FragmentManager fm = getSupportFragmentManager(); 
     fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); 
    } 
} 

Итак, когда вы реализуете код выше в одиночку, когда вы возобновите приложение, которое вы окажитесь в фрагменте, что вы на самом деле хотите быть совал. Вы можете использовать следующие пропущено, чтобы решить эту проблему:

public abstract class PopFragment extends Fragment { 

    private static final String KEY_IS_POPPED = "KEY_IS_POPPED"; 
    private boolean mPopped; 

    @Override 
    public void onSaveInstanceState(Bundle outState) { 
     outState.putBoolean(KEY_IS_POPPED, mPopped); 
     super.onSaveInstanceState(outState); 
    } 

    @Override 
    public void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     if (savedInstanceState != null) { 
      mPopped = savedInstanceState.getBoolean(KEY_IS_POPPED); 
     } 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
     if (mPopped) { 
      popFragment(); 
     } 
    } 

    protected void popFragment() { 
     mPopped = true; 
     // null check and interface check advised 
     ((PopActivity) getActivity()).popFragment(); 
    } 
} 
+1

Существует проблема, поскольку метод onCreate не вызывается, когда фрагмент возвращается на передний план –

Смежные вопросы