2011-10-07 3 views
0

ビューが外に出ると、私のアクティビティがクラッシュすることがあります。 LocationListenerを使用して、場所の更新を受け取り、画面に表示します。ここに関連コードがあります。 tvは速やかNullPointerExceptionを引き起こし、nullありながらLocationManager.removeUpdates()の直後にLocationListenerが呼び出されることがある

public class MyActivity extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
    } 

    @Override 
    protected void onStart() { 
     super.onStart(); 
     lm = (LocationManager) getSystemService(LOCATION_SERVICE); 
     tv = (TextView) findViewById(R.id.textView1); 
     lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, listener); 
    } 

    @Override 
    protected void onStop() { 
     lm.removeUpdates(listener); 
     tv = null; 
     lm = null; 
     super.onStop(); 
    } 

    private LocationManager lm; 
    private TextView tv; 
    private final LocationListener listener = new LocationListener() { 

     @Override 
     public void onLocationChanged(Location location) { 
      tv.setText(location.getLatitude() + ", " + location.getLongitude()); 
     } 

     @Override 
     public void onProviderDisabled(String provider) { 
     } 

     @Override 
     public void onProviderEnabled(String provider) { 
     } 

     @Override 
     public void onStatusChanged(String provider, int status, Bundle extras) { 
     } 

    }; 

} 

onLocationChanged()は、多くの場合、呼び出されます。私はonStop()以外のをnullに設定しておらず、アクティビティのmStoppedはデバッガに従ってtrueです。私は、活動が停止されているので、メインスレッドのHandlerの位置メッセージがエンキューされる競合状態があると思われます。

この動作はどこにも記載されていないようです。 onStop()の後にonLocationChanged()が呼び出されないようにするにはどうすればよいですか?

答えて

0

できません。変数をnullに設定する必要はありません。

0

リスナーに非同期で送信されるため、アクティビティが停止する直前に何かが送信される可能性があります。変数をnullに設定する必要はないという点で@ njzk2に同意し、onCreate()に変数を作成することができます。

しかし、また、それは活動がユーザーに表示されているとき、それは、これらの方法の間だからonResume()onPause()に更新を要求し、削除する方が良いでしょうことを追加します。あなたは位置サービスをできるだけ使用しないことを望みます。

また、質問に関連していないが、(それはJavaで重要ではありませんが)それが一番上に変数を置くためにあなたの洞察力のための

+0

おかげで、より標準的です。私はC++の世界から来ています。そこでは、最も目に見えるメンバーが最初に来て(公開され、その後保護され、その後プライベートに)来ます。あなたのポインタをクリーンアップしないこともJavaの良い習慣ですか?この場合、 'onLocationChanged()'に置いたものをいつでも実行できるようにするという余計な負担があります。これは[AsyncTaskと同じ問題を共有するようです。](http://stackoverflow.com/questions/3357477/is-asynctask-really-massively-flawed-or-am-i-just-missing-something) – Timothy003

+0

Javaの優れた点はGarbage collectorです。これは、参照(ポインタ)のないオブジェクトをすべてピックアップするVMデーモンです。実際に、コードが範囲外になるほとんどの場合(つまり、if句の中で変数が開始される)、ローカル変数は自動的に割り当て解除されます。 「アクティビティ」がイベントを取得できるようにするもう1つの方法は、[Finishing()](http://developer.android.com/reference/android/app/Activity.html#isFinishing())をチェックすることです。 – pablisco

関連する問題