【发布时间】:2011-10-07 15:21:13
【问题描述】:
我的活动有时会在看不见时崩溃。它使用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。除了onStop(),我没有将tv 设置为null,根据调试器,活动的mStopped 是true。我怀疑存在竞争条件,即在活动停止时位置消息在主线程的Handler 上排队。
这种行为似乎没有在任何地方记录。如何防止onLocationChanged() 在onStop() 之后被调用?
【问题讨论】:
标签: android android-location android-activity