我的活动有时会在视线之外崩溃。它使用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
设置为null
除onStop()
以外的任何位置,并且根据调试器,活动的mStopped
为true
。我怀疑存在竞争条件,当活动停止时,位置消息在主线程的Handler
上排队。
此行为似乎未在任何地方记录。如何阻止在onLocationChanged()
之后调用onStop()
?
答案 0 :(得分:0)
答案 1 :(得分:0)
很有可能在活动停止之前发送某些内容,因为它会异步发送到侦听器。我同意@ njzk2,因为您不需要将变量设置为null,您可以在onCreate()
中创建变量。
但是也想补充一点,最好是请求并删除onResume()
和onPause()
中的更新,因为当用户可以看到活动时,这些更新会介于这些方法之间。您希望尽可能少地使用位置服务。
此外,与问题无关,但将变量置于最高位置更为标准(尽管在Java中无关紧要)