2011-08-09 19 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);でnullポインタ例外を受け付けております。

私には何が欠けていますか?

+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の前に何とか呼び出されたり、2つの異なるインスタンスがある場合は、そのような臭いがあります。

+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

ヌルかどうかを確認するには、ちょうどtelephonyManagerをチェックしてください。

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

私がそれを好きにするなら、リスナーは削除されません。私はなぜtelephonyManagerがnullであるか把握しようとしています。 –

0

私は同じprobemを持っています。 実際には、すべてのnullフィールドを静的にした後に問題がなくなりました。 それは、本当にonDisabledを取得するプロバイダの別のインスタンスのように見えます。

関連する問題