IT Share you

NullPointerException을 던지는 Android FragmentManager BackStackRecord.run

shareyou 2020. 11. 16. 23:13
반응형

NullPointerException을 던지는 Android FragmentManager BackStackRecord.run


Fragments로 작업 할 때 때때로 다음 예외가 발생합니다.

FATAL EXCEPTION: main
java.lang.NullPointerException
    at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:591)
    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1416)
    at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:420)
    at android.os.Handler.handleCallback(Handler.java:615)
    at android.os.Handler.dispatchMessage(Handler.java:92)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:4745)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
    at dalvik.system.NativeStart.main(Native Method)

관리자에서 조각을 제거하려고 할 run()of BackStackRecord가를 통해 호출 되면 예외가 발생합니다 execPendingTransactions().

case OP_REMOVE: {
  Fragment f = op.fragment;
  f.mNextAnim = op.exitAnim; <----
  mManager.removeFragment(f, mTransition, mTransitionStyle);
}
break;

이 문제의 원인을 정확히 파악할 수없는 것 같습니다. 조각을 제거 할 때 바로 정리되지 않는 조각의 백 스택과 관련이 있다고 생각합니다.


내 질문에 답하기 :

전화 할 때이 예외가 (결국) 발생합니다 FragmentTransaction.remove(null);FragmentTransaction.commit();

편집 : 또한 Twice Circled 및 shinyuX가 주석에서 지적한 것처럼; show(null)또는 add(null), attach(null)detach(null)메서드를 호출 할 때hide(null)

를 호출 한 후 commit()트랜잭션은 FragmentManager에 대기됩니다. 결과적으로 명시 적으로를 호출 한 후 작업이 처리 중이 FragmentManager.executePendingTransactions()거나 FragmentManager 큐 스레드가이를 호출 할 때 NullPointerException.

제 경우에는 전역 개체에서 조각 상태를 유지하고있었습니다. 거기에서 조각이 표시되는지 여부를 확인한 다음 보이는 조각을 제거했습니다. 그러나 새로운 FragmentActivity를 시작했기 때문에 이러한 상태는 보이지 않는 동안 여전히 true로 설정되었습니다. 그래서 이것은 설계 오류입니다.

디자인 오류를 수정하는 것 외에 해결책은 간단했습니다. 조각을 제거하기 전에 FragmentManager.findFragmentByTag()반환 되었는지 확인 null하는 것입니다.


그것이 발생하는 한 가지 이유는

getSupportFragmentManager().beginTransaction().remove(fragment)

동안 fragment은 null


조각을 만드는 데 태그를 사용하지 않습니다 (TabBar 컨테이너처럼 작동 함).

그래서 Tab을 변경할 때 작동하지만 뒤로 버튼을 누르면 동일한 오류가 발생합니다.

onDestroyView 메서드에서 FragmentManager # findFragmentById가있는 조각 인스턴스를 찾았지만 FragmentManager # findFragmentByTag는 null을 반환합니다.

class MyFragment extends ListFragment {

@Override
public void onDestroyView() {
    super.onDestroyView();

    if (this.mapFragment != null
            && getFragmentManager().findFragmentById(
                    this.mapFragment.getId()) != null) {

        getFragmentManager().beginTransaction().remove(this.mapFragment)
                .commit();
        this.mapFragment = null;
    }

}
}

참고 URL : https://stackoverflow.com/questions/13393693/android-fragmentmanager-backstackrecord-run-throwing-nullpointerexception

반응형