0

アクティビティが表示されなくなるとクラッシュすることがあります。を使用し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()tvisの間に呼び出されることが多くnull、すぐにNullPointerException. 以外には設定tvしておらず、アクティビティはデバッガによるものです。アクティビティが停止しているときに、位置メッセージがメイン スレッドの右側でキューに入れられるという競合状態があると思われます。nullonStop()mStoppedtrueHandler

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

4

2 に答える 2

0

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

ただし、アクティビティがユーザーに表示されるときはこれらのメソッドの間にあるため、更新onResume()をリクエストして削除する方がよいことも付け加えたいと思います。onPause()位置情報サービスをできるだけ使用したくない。

また、質問とは関係ありませんが、変数を一番上に置く方が標準的です(Javaでは問題ありませんが)

于 2011-10-07T15:45:32.233 に答える
0

できません。ただし、変数を null に設定する必要もありません。

于 2011-10-07T15:38:08.447 に答える