所以我对MVVM很新。所以我在我的VM中获取数据,并且我在方法调用中将Activity / fragment作为侦听器传递。
我这样做的原因是因为如果出现错误,我将会收到回调。所以我用对话框在activity / fragment中处理它。
我不确定我是否在这里打破MVVM?如果我在使用此模式时出现任何其他错误,请告诉我。
谢谢
在我看来,片段/活动
/*creating and using my VM inside my fragment*/
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
//Create and observe data for any changes throughout the lifecycle
final OverviewViewModel viewModel = ViewModelProviders.of(this).get(OverviewViewModel.class);
//get info
viewModel.getUserInfo(this);
observeViewModel(viewModel);
}
//Listener in the activity/fragment that will handle an error in the request
@Override
public void onTokenExpired() {
ExpiredTokenDialogFragment dialogFragment = new ExpiredTokenDialogFragment();
dialogFragment.show(getFragmentManager(), EXPIRED_DIALOG);
}
我的视图模型,我提出请求。
public void getUserInfo(AuthenticationListener listener){
mUserInformationObservable = mRepository.getUserInfo(listener);
}
我的改装请求
public LiveData<UserInformation> getUserInfo(final AuthenticationListener authenticationListener){
final MutableLiveData<UserInformation> data = new MutableLiveData<>();
mService.fetchFollowers().enqueue(new Callback<UserInformation>() {
@Override
public void onResponse(Call<UserInformation> call, retrofit2.Response<UserInformation> response) {
//note, the result is in data. Calling response.body.string twice results in an empty string
if(response.body()!=null) data.setValue(response.body());
}
@Override
public void onFailure(Call<UserInformation> call, Throwable t) {
if(t instanceof UnauthorizedException){
data.setValue(null);
mToken.setAccessToken(null);
authenticationListener.onTokenExpired();
}
}
});
return data;
}
答案 0 :(得分:1)
不建议使用侦听器。 android-architecture项目使用SingleLiveEvent类来处理导航或显示Snackbar
等事件。您可以使用同一个类来显示对话框。
在OverviewViewModel
中,您可以添加其他字段:
final SingleLiveEvent<Void> tokenLiveData = SingleLiveEvent<Void>();
您可以使用onFaliure
回调中的:
tokenLiveData.call()
而不是回调。
在您的活动中订阅tokenLiveData
并在其发出值时显示对话框。