0

我的活动有时会在看不见时崩溃。它使用 aLocationListener接收位置更新并将其显示在屏幕上。这是相关的代码。

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()经常被称为while tvis null,及时引起a NullPointerException。我没有设置tvnull以外的任何地方onStop(),并且活动mStoppedtrue根据调试器的。Handler我怀疑存在竞争条件,当活动停止时,位置消息在主线程的右侧排队。

这种行为似乎没有在任何地方记录。如何防止onLocationChanged()被调用onStop()

4

2 回答 2

0

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

于 2011-10-07T15:38:08.447 回答
0

很有可能在活动停止之前发送了一些东西,因为它是异步发送到侦听器的。我同意@njzk2,因为您不需要将变量设置为 null,您可以在onCreate().

但还想补充一点,最好请求和删除更新,onResume()因为onPause()当活动对用户可见时,它在这些方法之间。您希望尽可能少地使用定位服务。

此外,与问题无关,但将变量放在顶部更标准(尽管在 Java 中无关紧要)

于 2011-10-07T15:45:32.233 回答