LocationListener иногда вызывается сразу после LocationManager.removeUpdates () - PullRequest
0 голосов
/ 07 октября 2011

Моя активность иногда падает, когда она выходит из поля зрения.Он использует 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()?

Ответы [ 2 ]

0 голосов
/ 07 октября 2011

Вполне возможно, что что-то отправляется непосредственно перед прекращением действия, поскольку оно отправляется слушателю асинхронно. Я согласен с @ njzk2 в том, что вам не нужно устанавливать переменные в null, и вы можете создавать переменные в onCreate().

Но также хочу добавить, что лучше запрашивать и удалять обновления в onResume() и onPause(), так как это между этими методами, когда активность видна пользователю. Вы хотите использовать услуги определения местоположения как можно меньше.

Кроме того, это не связано с вопросом, но более стандартно ставить переменные вверху (хотя это не имеет значения в Java)

0 голосов
/ 07 октября 2011

ты не можешь.но вам также не нужно устанавливать переменные в null.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...