Android 进行API调用时,LiveData首先返回旧值,然后返回新值

Android 进行API调用时,LiveData首先返回旧值,然后返回新值,android,api,repository,viewmodel,android-livedata,Android,Api,Repository,Viewmodel,Android Livedata,我正在使用LiveData和RoomDB,我的问题是,当我将observe()放在LiveData上,然后请求从服务器获取更新时,它首先给我它以前请求过的值,然后一旦请求完成,它给我它从服务器获得的新值 当以前没有请求时,它会像我希望的那样工作,这意味着它会直接从服务器获取数据,然后显示它,但是当以前有请求并且LiveData已经有一个值时,它会首先显示旧的,然后显示新的 我想让它只显示新的 变量(viewModel,repository等)来自dagger 主要活动: viewModel.ge

我正在使用
LiveData
RoomDB
,我的问题是,当我将
observe()
放在
LiveData
上,然后请求从服务器获取更新时,它首先给我它以前请求过的值,然后一旦请求完成,它给我它从服务器获得的新值

当以前没有请求时,它会像我希望的那样工作,这意味着它会直接从服务器获取数据,然后显示它,但是当以前有请求并且
LiveData
已经有一个值时,它会首先显示旧的,然后显示新的

我想让它只显示新的

变量(
viewModel
repository
等)来自dagger

主要活动:

viewModel.getPointGeoLocation(changedyPoints.get(0)).observe(this, new Observer<LatLng>() {
                @Override
                public void onChanged(@Nullable LatLng latLng) {
                    if (latLng != null) {...} else {...}}});
因此,基本上,如果我之前有一个值为
null
的响应,然后再次调用此API,它将首先返回
null
,然后返回正确的响应


第一个方法
viewModel.getPointGeoLocation()
被多次调用,因此这可能是问题所在,但对我来说,它似乎需要位于方法内部,并在单击按钮时进行操作,因为它所在的方法包含大量
onChanged()
应该使用的数据

你明白答案了吗?因为我有同样的问题,我想答案是创建一个定制的LiveData类。我会尽快找到它的。是的,我也遇到了同样的问题,在API提取完成之前,我的旧数据被返回。你得到解决方案了吗?因为我有同样的问题,我想答案是创建一个定制的LiveData类。我会尽快找到它的。当然,我也遇到了同样的问题,在API的获取完成之前,我的旧数据会被返回
public LiveData<LatLng> getPointGeoLocation(Point Point) {
    repository.fetchGeoLocationCoordinates(Point);
    return repository.getPointGeoLocationNetworkSource();
}
@Override
public void fetchGeoLocationCoordinates(Point Point) {
    pointNetworkDataSource.fetchGeoLocations(point);
}    

@Override
public LiveData<LatLng> getPointGeoLocationNetworkSource() {
   return pointNetworkDataSource.getPointGeoLocationData();
}
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;
}
@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");
        }
    });
}