AAC:如何将ViewModel的结果(句柄单击)返回给活动?

时间:2019-02-20 14:48:23

标签: mvvm android-architecture-components

我想在我的项目 Android体系结构组件(AAC)中使用。 很好。

这是我的活动:

    import androidx.appcompat.app.AppCompatActivity;
    public class TradersActivity extends AppCompatActivity  {
        private TradersViewModel tradersViewModel;

         @Override
         protected void onCreate(@Nullable Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);


              tradersViewModel = ViewModelProviders.of(this).get(TradersViewModel.class);

              tradersViewModel.getIsEnableSwipeProgress().observe(this, new Observer<Boolean>() {

                    @Override
                    public void onChanged(Boolean isEnable) {
                        // do some work with UI
                    }
                });

        }

        // button click        
        public void onClickViewJson(Trader trader) {
             tradersViewModel.doClickJsonView(trader);
        }

    }

这是我的ViewModel

public class TradersViewModel extends ViewModel {
private MutableLiveData<Boolean> isEnableSwipeProgress = new MutableLiveData<>();

 public void doClickJsonView(Trader trader) {
      // DO_SOME_COMPLEX_BUSINESS_LOGIC
 }

 public MutableLiveData<Boolean> getIsEnableSwipeProgress() {
      return isEnableSwipeProgress;
 }

}

在屏幕上,我有按钮。然后,当单击此按钮时,我将调用活动的方法-onClickViewJson(Trader trader)

此方法调用tradersViewModel.doClickJsonView(trader);

viewModel中,此方法执行一些复杂的业务逻辑。 方法完成后,我需要将结果( json )返回到我的活动。

我该怎么做?

1 个答案:

答案 0 :(得分:1)

请记住,在MVVM中,ViewModel不了解您的视图。 您的ViewModel应该公开变量,以便您的视图可以观察并对其进行反应。

 private MutableLiveData<Boolean> isEnableSwipeProgress = new MutableLiveData<>();

 private MutableLiveData<JSONDto> jsonLiveData = new MutableLiveData<>();

 public void doClickJsonView(Trader trader) {
      // DO_SOME_COMPLEX_BUSINESS_LOGIC
      jsonLiveData.postValue(/* the json you obtain after your logic finish */ )
 }

 public MutableLiveData<Boolean> getIsEnableSwipeProgress() {
      return isEnableSwipeProgress;
 }

 public LiveData<JSONDto> getJsonDto() {
      return this.jsonLiveData;
 }


在您看来,您对jsonDto的更改有反应:

tradersViewModel.getJsonDto().observe(this, new Observer<JSONDto>() {

                    @Override
                    public void onChanged(JSONDto json) {
                         if (json != null) {
                           // Do what you need here.
                         }
                    }
                });