2016-10-02 1 views
0

Fabric이 설명 할 수없는 몇 가지 NPE 발생에 대해 이야기했습니다. 그들은 다른 장치 및 안드로이드 버전에서 발생합니다. 항상 GameLogic 인스턴스를 초기화에서 onCreate()에서 이미 조각에 전달 활동에 대한조각에 불가능한 NPE

Fatal Exception: java.lang.RuntimeException: Unable to start activity ComponentInfo{lelisoft.com.lelimath/lelisoft.com.lelimath.activities.CalcActivity}: java.lang.NullPointerException 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2328) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2386) 
    at android.app.ActivityThread.access$900(ActivityThread.java:169) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1277) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:136) 
    at android.app.ActivityThread.main(ActivityThread.java:5476) 
    at java.lang.reflect.Method.invokeNative(Method.java) 
    at java.lang.reflect.Method.invoke(Method.java:515) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099) 
    at dalvik.system.NativeStart.main(NativeStart.java) 
Caused by java.lang.NullPointerException 
    at lelisoft.com.lelimath.fragment.CalcFragment.setupPlay(CalcFragment.java:253) 
    at lelisoft.com.lelimath.fragment.CalcFragment.onActivityCreated(CalcFragment.java:86) 
    at android.support.v4.app.Fragment.performActivityCreated(Fragment.java:2089) 
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1133) 
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1290) 
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1272) 
    at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:2149) 
    at android.support.v4.app.FragmentController.dispatchActivityCreated(FragmentController.java:201) 
    at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:600) 
    at android.support.v7.app.AppCompatActivity.onStart(AppCompatActivity.java:178) 
    at lelisoft.com.lelimath.activities.LeliBaseActivity.onStart(LeliBaseActivity.java:94) 
    at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1177) 
    at android.app.Activity.performStart(Activity.java:5461) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2301) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2386) 
    at android.app.ActivityThread.access$900(ActivityThread.java:169) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1277) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:136) 
    at android.app.ActivityThread.main(ActivityThread.java:5476) 
    at java.lang.reflect.Method.invokeNative(Method.java) 
    at java.lang.reflect.Method.invoke(Method.java:515) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099) 
    at dalvik.system.NativeStart.main(NativeStart.java) 

이제 소스 코드 :

public class CalcFragment extends LeliBaseFragment { 
CalcLogic logic; 

public void setLogic(CalcLogic logic) { 
    this.logic = logic; 
} 

public void onActivityCreated(Bundle state) { 
    setupPlay(); 
} 
:

public class CalcActivity .. { 
GameLogic gameLogic; 

protected void onCreate(Bundle state) { 
    setContentView(R.layout.act_calc); 
    setGameLogic(new CalcLogicImpl()); 
    calcFragment = new CalcFragment(); 
    calcFragment.setLogic((CalcLogic) gameLogic); 
    initializeCalcFragment(false); 
} 

private void initializeCalcFragment(boolean replace) { 
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 
    if (replace) { 
     transaction.replace(R.id.calc_content, calcFragment); 
    } else { 
     transaction.add(R.id.calc_content, calcFragment); 
    } 
    transaction.commit(); 
} 

public void setGameLogic(GameLogic gameLogic) { 
    this.gameLogic = gameLogic; 
} 

는 그런 다음 CalcFragment있다

그리고 여기서 NPE와 함께 실패합니다.

private void setupPlay() { 
    formulas = logic.generateFormulas(); 
} 

흐름이 명확하고 다른 속성 할당이 없습니다. 활동이 작성되고, 특성이 인스턴스화되고 설정되며, 조각이 작성되고 특성이 전달됩니다. 그런 다음 단편은 onActivityCreated으로 초기화되지만 속성이 null 일 때도 있습니다. 그것은 내 모든 실제 장치 및 가상 장치에서 잘 작동합니다. 내가보고 된 장치에서 왜 비어 있는지 전혀 모른다.

+0

어디에서 gameLogic 변수를 초기화하나요? – Sanjeet

+0

setter setGameLogic에서 onCreate를 참조하십시오. –

+0

'LeliBaseActivity.onStart() '란 무엇입니까? 그것은 당신의 프래그먼트가 활성화되는 곳입니다. – kichik

답변

3

Android 프레임 워크는 구성 변경을 처리하기 위해 조각을 다시 인스턴스화해야하는 경우가 있습니다. CalcLogic과 같은 인스턴스 상태가 손실됩니다. 그것을 고정

일부 옵션은 :

  1. 는 조각의 onCreate() 또는 기타 유사한 초기 라이프 사이클 방식의 활동에서 logic 필드의 값을 당깁니다.

  2. setRetainInstance(true)을 호출하면 재 인스턴스화가 일반적으로 발생하는 일부 사례에서 프래그먼트 인스턴스가 유지됩니다.

+0

고마움, 나는 그것을 시도 할 것이다 –

+0

이 부분을 다시 작성한 이후로 문제가 발생하지 않았습니다. 감사. –