2

mainActivity, onCreate (...) 메소드에서 멤버 변수를 초기화하는 액티비티가 있습니다. 이 변수는 onStart() 및 onStop() 메서드에서 사용됩니다.Android : 멤버 변수가 null이 됨

아주 간단합니다. 이제 문제는 내 사용자가 onStop() 메소드에서 발생하는 NullPointerException 오류 보고서를 받기 시작한 것입니다.

광범위하게 원인을 찾고 있었고 android가 메모리를 확보하기로 결정했을 때 정적 변수가 null이 될 수 있음을 이해하지만 onCreate()에서 초기화되는 멤버 변수가있는 대/소문자를 찾을 수 없습니다. . 코드는 다음입니다 :

public class MainActivity extends ActionBarActivity implements ActionBar.TabListener, SharedPreferences.OnSharedPreferenceChangeListener { 
private MySvc mySvc; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState);  
    mySvc = DI.i().getMySvc(); 
    ... 
} 

@Override 
protected void onStart() { 
    super.onStart(); 
    mySvc.start(); 
} 

... 

@Override 
protected void onStop() { 
    super.onStop(); 
    //here I get NPE 
    mySvc.stop(); 
} 
} 

}는 상황이 더욱 신비하려면 I 앱의 특정 버전에서만이 충돌 보고서를하기 시작하지만 이전 버전) (ONSTART에서 같은 동작을 및 onStop().

나는 어떤 힌트에도 감사 할 것입니다.

편집 :.

  • DI.i() getMySvc(); 싱글 톤 패턴에 따라 null이 반환되지 않습니다.
  • MySvc는 MySvc은 안드로이드 VM 그것을 필요로 GC 선택할 수 있습니다 무엇에 따라
+0

이것을 확인해보십시오. http://stackoverflow.com/questions/151777/saving-activity-state-in-android – PedroAGSantos

+1

을 검색하는 것으로 생각됩니다. DI.i(). getMySvc(); ''null'을 반환합니까? –

+0

@subspider이 링크는이 질문에 어떻게 적용됩니까? –

답변

1

나는 사과해야 할 필요가있다. 문제는 우리 코드에 의해 발견되었다. 사용자가 오프라인 인 경우

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState);  
    if (!isInternetConnectionPresent()) { 
     return; 
    } 
    mySvc = DI.i().getMySvc(); 
... 
} 

그래서, 그들은 변수가 초기화되지 않았다 때문에, 그러나 이동 중지()를 호출하고, NPE를 가지고 : 특정 버전에서 우리는 다음과 같이() 메소드에서 onCreate에 인터넷 연결 검사를 추가했습니다. 근본 원인이 오류 처리에 대한 잘못된 접근이라고 생각합니다. 달성하고자하는 것은 활동으로부터 예외를 던질 수 있고 그러한 예외를 처리 할 수있는 일반 핸들러가 있어야합니다. 그래서이 경우에는 NoInternetConnectionException을 던지고 처리기는 사용자에게 의미있는 대화 상자를 표시합니다. 또한 예외가 throw 될 때 다른 라이프 사이클 메서드가 호출되는지 궁금합니다.

-1

DI 클래스에서 인스턴스화하는 POJO이다. 안드로이드를 사용하는 가장 좋은 방법은 먼저 null을 확인하고 필요한 경우 다시 인스턴스화 한 다음 원하는 것을 수행하는 것입니다. 항상 나를 위해 작동하며 성능 문제는 없습니다.

+1

VM은 GC 도달 할 수없는 객체 만 갖습니다. 도달 할 수있는 참조가 있으면 VM은 객체를 GC하지 않습니다. VM은 우리 코드의 참조를 무작위로 'null'로 설정하지 않습니다. –

+0

사실, 여기가 내가 혼란스러워하는 이유입니다. 일시적으로 문제를 해결했습니다 : DI.i(). getMySvc(). stop() onStop() 메소드. 그러나 인스턴스 변수가 null이 될 수는 없습니다. –

+0

예, 사실입니다.그러나 쿼리 코드의 호출은 DI.i(). getMySvc(); 나는 그것이 무엇을하는지 모릅니다. 그래서 Code-Apprentice도 알지 못하면 투표를 취소하십시오. 분명히 'MySvc가 무엇인지에 따라 달라집니다.' – Nazgul

관련 문제