LocationListener有时会在LocationManager.removeUpdates()之后立即调用

时间:2011-10-07 15:21:14

标签: android android-location android-activity

我的活动有时会在视线之外崩溃。它使用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()tv时,

null经常被调用,并立即导致NullPointerException。我没有将tv设置为nullonStop()以外的任何位置,并且根据调试器,活动的mStoppedtrue。我怀疑存在竞争条件,当活动停止时,位置消息在主线程的Handler上排队。

此行为似乎未在任何地方记录。如何阻止在onLocationChanged()之后调用onStop()

2 个答案:

答案 0 :(得分:0)

你不能。但您也不需要将变量设置为空。

答案 1 :(得分:0)

很有可能在活动停止之前发送某些内容,因为它会异步发送到侦听器。我同意@ njzk2,因为您不需要将变量设置为null,您可以在onCreate()中创建变量。

但是也想补充一点,最好是请求并删除onResume()onPause()中的更新,因为当用户可以看到活动时,这些更新会介于这些方法之间。您希望尽可能少地使用位置服务。

此外,与问题无关,但将变量置于最高位置更为标准(尽管在Java中无关紧要)