将Activity / Fragment作为侦听器参数传递给VM方法

时间:2018-02-04 17:44:28

标签: android mvvm android-architecture-components

所以我对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;
}

1 个答案:

答案 0 :(得分:1)

不建议使用侦听器。 android-architecture项目使用SingleLiveEvent类来处理导航或显示Snackbar等事件。您可以使用同一个类来显示对话框。

OverviewViewModel中,您可以添加其他字段:

final SingleLiveEvent<Void> tokenLiveData = SingleLiveEvent<Void>();
您可以使用onFaliure回调中的

tokenLiveData.call()

而不是回调。

在您的活动中订阅tokenLiveData并在其发出值时显示对话框。