ビューが外に出ると、私のアクティビティがクラッシュすることがあります。 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()
が呼び出されないようにするにはどうすればよいですか?
おかげで、より標準的です。私はC++の世界から来ています。そこでは、最も目に見えるメンバーが最初に来て(公開され、その後保護され、その後プライベートに)来ます。あなたのポインタをクリーンアップしないこともJavaの良い習慣ですか?この場合、 'onLocationChanged()'に置いたものをいつでも実行できるようにするという余計な負担があります。これは[AsyncTaskと同じ問題を共有するようです。](http://stackoverflow.com/questions/3357477/is-asynctask-really-massively-flawed-or-am-i-just-missing-something) – Timothy003
Javaの優れた点はGarbage collectorです。これは、参照(ポインタ)のないオブジェクトをすべてピックアップするVMデーモンです。実際に、コードが範囲外になるほとんどの場合(つまり、if句の中で変数が開始される)、ローカル変数は自動的に割り当て解除されます。 「アクティビティ」がイベントを取得できるようにするもう1つの方法は、[Finishing()](http://developer.android.com/reference/android/app/Activity.html#isFinishing())をチェックすることです。 – pablisco