Иногда получаю обратные вызовы после removeLocationUpdates()

Создание моего первого приложения,

Поиск местоположений с помощью GoogleApi, и обратный вызов работает по назначению. Я использую местоположение, и оно помещается в базу данных, onDestroy() я закрываю соединение с БД. Но теперь я иногда получаю трассировку стека, говорящую

java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase

Я добавил removeLocationUpdates() прямо перед вызовом closeDB, и это ПОЧТИ решило проблему, но время от времени это все еще происходит. Похоже, что я все еще могу получить мошеннический обратный вызов после того, как были вызваны removeLocationUpdates и closeDB.

Это типичная задержка? может ли задержка в 500 мс между removeLocUpdates и closeDB решить проблему? Я бы предположил, что есть лучший способ, или, может быть, я просто делаю что-то не так с removeLocUpdates. Но трассировка стека кажется довольно ясной, что я получаю обратный вызов, как показывает трассировка

onLocationChanged

часть пути вниз по стеку

РЕДАКТИРОВАТЬ, чтобы добавить код:

при создании():

        openDB();

    if (mGoogleApiClient == null) {
        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .addApi(LocationServices.API)
                .build();
    }

    //End Google Location API implementation


    locationListener = new com.google.android.gms.location.LocationListener() {
        @Override
        public void onLocationChanged(Location location) {
            //newestLocation = location;
            //bestLocation = bestLocation();
            //todo maybe come back and reimplement bestLocation() if needed
            bestLocation = location;
            getCode(null);
            saveCode(null);
        }};

onDestroy()

       if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
        if (mGoogleApiClient.isConnected()) {
            LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, locationListener);
        }
    }
    closeDB();

при подключении()

    public void onConnected(@Nullable Bundle bundle) {
    CharSequence text = "Google API Connected";
    Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT).show();

    LocationRequest locationRequest = new LocationRequest()
            .setFastestInterval(500)
            .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
            .setMaxWaitTime(3000)
            .setInterval(1000);
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.ACCESS_FINE_LOCATION},10);
        return;
    }else {
        LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, locationRequest, locationListener);
    }
    return;
}

Я ценю вашу помощь в этом вопросе


person Chris DL    schedule 13.02.2017    source источник
comment
Может быть полезно опубликовать часть вашего кода, чтобы мы могли видеть, что происходит.   -  person Luud van Keulen    schedule 13.02.2017
comment
Добавлен некоторый код, в основном только то, где я начинаю прослушивать обновления местоположения и где я останавливаюсь.   -  person Chris DL    schedule 13.02.2017
comment
Посмотрите, поможет ли вам этот пост: stackoverflow.com/a/12770366/5333805   -  person Luud van Keulen    schedule 13.02.2017
comment
Хотя я ценю ссылку, там определенно есть информация, которую нужно изучить, я совершенно уверен, что моя проблема заключается в том, что их обратный вызов происходит после закрытия БД (при закрытии приложения onDestroy). Связанная ошибка и последующий ответ, по-видимому, вызваны чем-то другим.   -  person Chris DL    schedule 13.02.2017