Java MVVM-我应该在哪里调用用户位置?

Java MVVM-我应该在哪里调用用户位置?,java,android,mvvm,retrofit,Java,Android,Mvvm,Retrofit,目前,我正在构建一个应用程序,它将为用户显示最近的预测。为了进行api调用,我必须提供经度和纬度作为参数。目前,我已经编写了一些关于获取语言度和经度的代码,但没有收到正确的数据。当我在MainActivity中编写这些方法时,首先,经度和纬度等于0.0,大约两秒钟后,它就能够获得正确的数据。我应该冻结应用程序直到locationManage获得正确的数据,还是应该在其他地方调用这些方法?我应该在存储库中给他们打电话吗 检查权限 if (ContextCompat.checkSelfPermiss

目前,我正在构建一个应用程序,它将为用户显示最近的预测。为了进行api调用,我必须提供经度和纬度作为参数。目前,我已经编写了一些关于获取语言度和经度的代码,但没有收到正确的数据。当我在MainActivity中编写这些方法时,首先,经度和纬度等于0.0,大约两秒钟后,它就能够获得正确的数据。我应该冻结应用程序直到locationManage获得正确的数据,还是应该在其他地方调用这些方法?我应该在存储库中给他们打电话吗

检查权限

if (ContextCompat.checkSelfPermission(
            getApplicationContext(), Manifest.permission.INTERNET) == PackageManager.PERMISSION_GRANTED &&
            ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED &&
            ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
        mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);

    } else {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            requestPermissions(new String[]{
                    Manifest.permission.INTERNET, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION
                    
            }, 1);
        }
    }
}
onLocationChanged

@Override
public void onLocationChanged(@NonNull Location location) {
    mLatitude = location.getLatitude();
    mLongitude = location.getLongitude();

    Log.i(TAG, "onLocationChanged: "+mLatitude+" "+mLongitude);
}
存储库中的

public static double mLatitude = MainActivity.mLatitude;
public static double mLongitude = MainActivity.mLongitude;

public ForecastRepository(){
    mApi = RetrofitBuilder.makeCall();
}

public MutableLiveData<ForecastModel> testCall() {
    MutableLiveData<ForecastModel> data = new MutableLiveData<>();

    //TODO temporary values such as latitude/longitude in api call
    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());
            }
            Log.i(TAG, "onResponse: successful "+mLatitude+" "+mLongitude);
            data.setValue(response.body());
        }

        @Override
        public void onFailure(Call<ForecastModel> call, Throwable t) {
            Log.i(TAG, "onFailure: "+t.getMessage());
        }
    });
    return data;
}
}
public static double mLatitude=MainActivity.mLatitude;
公共静态双长度=main activity.m长度;
公共房屋预售处(){
mApi=builder.makeCall();
}
公共MutableLiveData测试调用(){
MutableLiveData=新的MutableLiveData();
//TODO api调用中的纬度/经度等临时值
test(mLatitude,mllongitude,“metric”,API_KEY).enqueue(newcallback(){
@凌驾
公共void onResponse(调用、响应){
如果(!response.issusccessful()){
Log.i(标记“onResponse:+response.code());
}
Log.i(标记“onResponse:successful”+mLatitude+“”+mlongity);
data.setValue(response.body());
}
@凌驾
失败时公共无效(调用调用,可丢弃的t){
Log.i(标记“onFailure:+t.getMessage());
}
});
返回数据;
}
}

正确的方法是使用
LocationRepository
在设备位置的
后台线程中执行所有获取操作

在ViewModel中创建一个
MutableLiveData
,您将在其中分配位置

然后使用postValue()或setValue()更新其值

为此MutableLiveData编写公共getter。此存储库将成为您的位置API

然后,ViewModel应该
调用存储库的方法
,并将其结果分配给ViewModel的LiveData变量

然后在活动中观察ViewModel的Live数据


并进行API调用。

谢谢您的回答。我有一个问题-我是否必须为此创建另一个存储库和视图模型?或者我可以使用我的存储库从api获取数据?如您所愿,但我希望您创建另一个存储库。如果这个答案有帮助,请接受答案并投票表决。