我正在使用LiveData
和RoomDB
,但是我的问题是,当我将observe()
放在LiveData
上,然后发出从服务器获取更新的请求时,它首先为我提供了之前请求的值,然后在完成请求后为我提供了从服务器获得的新值。
当没有先前的请求时,它的工作方式就像我希望的那样,这意味着它将直接从服务器获取数据,然后显示它,但是当先前发出请求并且LiveData
已经有一个请求时值,那么它将首先显示旧的,然后显示新的。
我想要的是仅显示新的。
变量(viewModel
,repository
等)来自匕首。
主要活动:
viewModel.getPointGeoLocation(changedyPoints.get(0)).observe(this, new Observer<LatLng>() {
@Override
public void onChanged(@Nullable LatLng latLng) {
if (latLng != null) {...} else {...}}});
ViewModel类:
public LiveData<LatLng> getPointGeoLocation(Point Point) {
repository.fetchGeoLocationCoordinates(Point);
return repository.getPointGeoLocationNetworkSource();
}
RepositoryImpl类:
@Override
public void fetchGeoLocationCoordinates(Point Point) {
pointNetworkDataSource.fetchGeoLocations(point);
}
@Override
public LiveData<LatLng> getPointGeoLocationNetworkSource() {
return pointNetworkDataSource.getPointGeoLocationData();
}
NetworkDataSource类:
public void fetchGeoLocations(Point point) {
executors().getNetworkIO().execute(new Runnable() {
@Override
public void run() {
AuthTokenUtil.waitForAuthToken(authTokenRepository);
AuthToken authToken = authTokenRepository.getAuthToken().getValue();
if (authToken.isValid()) {
pointBackendApi.getGeoLocations(authToken.getToken(), point,
new PointBackendApi.GeoLocationHandler() {
@Override
public void update(LatLng latLng) {
pointGeoLocationData.postValue(latLng);
}
});
} else {
Log.d(TAG, "invalid auth token");
}
}
});
}
public LiveData<LatLng> getPointGeoLocationData() {
return pointGeoLocationData;
}
最后是后端API:
@Override
public void getGeoLocations(String token, Point point, GeoLocationHandler geoLocationHandler) {
http.getJson(POINT_GET_GEO_LOCATION_UPDATE, token, point.domesticAddress.formattedString, new Callback() {
@Override
public void onResponse(@NonNull Call call, @NonNull Response response) {
try (ResponseBody body = response.body()) {
if (body == null || body.contentLength() == 0) {
Log.d(TAG, "received no response");
return;
}
String res = body.string();
LatLng result = new Gson().fromJson(res, LatLng.class);
if (result != null && (result.latitude != 0 && result.longitude != 0)) {
Log.i(TAG, "received" + " points" + result.toString());
geoLocationHandler.update(result);
} else {
geoLocationHandler.update(null);
Log.d(TAG, "Received 0, 0 coordinates");
}
} catch (Exception ex) {
Log.e(TAG, ex.getMessage() != null ? ex.getMessage() : "HTTP problem");
}
}
@Override
public void onFailure(@NonNull Call call, @NonNull IOException e) {
Log.w(TAG, "get failed");
}
});
}
因此,基本上,如果我之前有一个响应,值为null
,然后再次调用此API,它将首先返回null
,然后返回正确的响应。
第一个方法viewModel.getPointGeoLocation()
被多次调用,因此可能是一个问题,但对我来说,它似乎需要位于方法内部并在单击按钮时起作用,因为它所在的方法包含一个onChanged()
应该使用的大量数据。