2011-08-09 5 views
2

는 짧게 ... 나는 위젯을 가지고, 당신은안드로이드 NullPointerException이

public class ExampleWidget extends AppWidgetProvider { 
private PhoneStateListener listener; 
private TelephonyManager telephonyManager; 

@Override 
public void onUpdate(Context context, AppWidgetManager appWidgetManager, 
     int[] appWidgetIds) { 

    listener = new PhoneStateListener() { 
     @Override 
     public void onDataConnectionStateChanged(int state) { 
      // removed the code 
     } 

    }; 

    telephonyManager = (TelephonyManager) context 
      .getSystemService(Context.TELEPHONY_SERVICE); 
    telephonyManager.listen(listener, 
      PhoneStateListener.LISTEN_DATA_CONNECTION_STATE); 

} 

@Override 
public void onDisabled(Context context) { 
    telephonyManager.listen(listener, PhoneStateListener.LISTEN_NONE); 
    super.onDisabled(context); 
} 
} 

아래의 중요한 부분을 볼 수 있고 내가 주 화면에서 위젯을 제거하고 때 나는 telephonyManager.listen(listener, PhoneStateListener.LISTEN_NONE);에서 nullpointer 예외를 수신하고 있습니다.

무엇이 누락 되었습니까?

+0

NPE는 어디에서 발생합니까? 당신이 말한 라인 안에서 또는 .listen() 내부에서? 위젯에 대한 구성 활동이 있습니까? – marsbear

답변

2

context.getSystemService()null 일 수 있으며 null이면 telephonyManager을 증명할 수 없습니다. Context.TELEPHONY_SERVICE으로 식별 된 이름이 시스템에 없으면 telephonyManagernull이됩니다. 귀하의 코멘트에 추가

:

@Override 
public void onDisabled(Context context) { 
    if (telephonyManager!=null){ 
     telephonyManager.listen(listener, PhoneStateListener.LISTEN_NONE); 
    } 
    super.onDisabled(context); 
} 

당신이 telephonyManager를 초기화해야 onDisabled 방법이 코드를 실행해야하는 경우

. onDisabled 메서드가 onUpdate 전에 어떻게 든 호출되거나 두 가지 인스턴스가있는 경우 냄새가납니다.

+0

사용하고 있기 때문에 null이 아니며 작동합니다. 사용중인 코드가 삭제되었습니다. onDisabled()에서 null이라고 말합니다. –

+0

@Alex 내가 내 게시물을 연장했습니다. – fyr

+0

메서드가 onUpdate() 전에 호출되지 않았습니다. 나는 로그를 추적했다. –

0
public class ExampleWidget extends AppWidgetProvider { 
private PhoneStateListener listener; 
private TelephonyManager telephonyManager; 

@Override 
public void onUpdate(Context context, AppWidgetManager appWidgetManager, 
     int[] appWidgetIds) { 


    telephonyManager = (TelephonyManager) context 
      .getSystemService(Context.TELEPHONY_SERVICE); 
    telephonyManager.listen(listener, 
      PhoneStateListener.LISTEN_DATA_CONNECTION_STATE); 

} 

@Override 
public void onDisabled(Context context) { 
    telephonyManager.listen(listener, PhoneStateListener.LISTEN_NONE); 
    super.onDisabled(context); 
} 
listener = new PhoneStateListener() { 
     @Override 
     public void onDataConnectionStateChanged(int state) { 
      // removed the code 
     } 

    }; 

} 
0

null인지 확인하려면 telephonyManager을 확인하십시오.

if(telephonyManager==null){ 
    telephonyManager = (TelephonyManager) context 
     .getSystemService(Context.TELEPHONY_SERVICE); 
} 
telephonyManager.listen(listener, PhoneStateListener.LISTEN_NONE); 
+0

내가 좋아하면 청취자가 제거되지 않습니다. telephonyManager가 null 인 이유를 알아 내려고하고 있습니다. –

0

동일한 probem이 있습니다. 모든 null 필드를 정적으로 설정 한 후에 실제로 문제가 사라졌습니다. 그 모습은 onDisabled를 얻는 공급자의 또 다른 사례입니다.

관련 문제