【发布时间】:2021-04-11 06:04:01
【问题描述】:
我需要在两个存储库之间共享两个变量。我已经尝试了许多不同的解决方案,但都没有奏效。简而言之:第一个存储库包含用户最后已知的位置(地理纬度和经度)第二个存储库调用具有指定端点的 api,例如地理纬度和经度。问题是我不断收到等于 0,0 的值。你能给我一些提示我应该怎么做吗?我观察到的一件事是,整个程序立即运行,而位置存储库需要几秒钟才能实际获得纬度和经度。所以程序只是不断地调用端点等于 0,0 的 api,正如我上面的意思。
位置存储库
public class LocationRepository {
private double mLatitude, mLongitude;
public void test(Application application) {
FusedLocationProviderClient client = LocationServices.getFusedLocationProviderClient(application.getApplicationContext());
{
if (ContextCompat.checkSelfPermission(
application.getApplicationContext(), Manifest.permission.INTERNET) == PackageManager.PERMISSION_GRANTED &&
ContextCompat.checkSelfPermission(application.getApplicationContext(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED &&
ContextCompat.checkSelfPermission(application.getApplicationContext(), Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
client.getLastLocation().addOnSuccessListener(new OnSuccessListener<Location>() {
@Override
public void onSuccess(Location location) {
mLongitude = location.getLongitude();
mLatitude = location.getLatitude();
}
});
}
}
}
}
预测存储库
public MutableLiveData<ForecastModel> testCall() {
MutableLiveData<ForecastModel> data = new MutableLiveData<>();
mApi.test(mLatitude, mLongitude, "metric", API_KEY).enqueue(new Callback<ForecastModel>() {
@Override
public void onResponse(Call<ForecastModel> call, Response<ForecastModel> response) {
if (!response.isSuccessful()) {
Log.i(TAG, "onResponse: " + response.code());
}
data.setValue(response.body());
}
@Override
public void onFailure(Call<ForecastModel> call, Throwable t) {
Log.i(TAG, "onFailure: " + t.getMessage());
}
});
return data;
}
视图模型
private ForecastRepository mForecastRepository;
private LocationRepository mLocationRepository;
private MutableLiveData<ForecastModel> mForecastData;
public ForecastViewModel(@NonNull Application application) {
super(application);
mLocationRepository = new LocationRepository();
mLocationRepository.test(application);
mForecastRepository = new ForecastRepository();
mForecastData = mForecastRepository.testCall();
}
【问题讨论】:
-
ForecaseRepository如何访问LocationRepository的mLatitude和mLongitude变量?
-
目前还没有。我已经删除了我试图清理代码的所有内容。我已经尝试将变量设为静态,通过方法发送这些变量,甚至作为列表。
-
您需要使用 livedata/stateflow,并在预测存储库中观察它。
-
我以为你无法观察存储库中的实时数据。
-
您可以随心所欲地观察它。试着正确地构建你的代码。
标签: java android api mvvm retrofit