Создание моего первого приложения,
Поиск местоположений с помощью 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;
}
Я ценю вашу помощь в этом вопросе