开发者

LocationListener sometimes getting called right after LocationManager.removeUpdates()

My activity sometimes crashes when it goes out of view. It uses a LocationListener to receive location updates and show them on the screen. Here is the relevant code.

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 onP开发者_StackOverflow社区roviderDisabled(String provider) {
        }

        @Override
        public void onProviderEnabled(String provider) {
        }

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

    };

}

onLocationChanged() often gets called while tv is null, promptly causing a NullPointerException. I'm not setting tv to null anywhere other than onStop(), and the activity's mStopped is true according to the debugger. I suspect there's a race condition where location messages get enqueued on the main thread's Handler right as the activity is being stopped.

This behavior doesn't seem to be documented anywhere. How do I prevent onLocationChanged() from being called after onStop()?


you can't. but you don't need to set your variables to null either.


It's quite possible that something gets sent just before the activity stops since it gets sent asynchronously to the listener. I agree with @njzk2 in that you don't need to set your variables to null and you can create the variables in onCreate().

But also want to add that it's better to request and remove the updates in onResume() and onPause() since it's between these methods when the activity is visible to the user. You want to use the location services as little as possible.

Also, not related with the question but it's more standard to put the variables at the top (although it doesn't matter in Java)

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜