【问题标题】:how to communicate to activity/fragment from repository class for web service in MVVM architecture如何从 MVVM 架构中的 Web 服务的存储库类与活动/片段进行通信
【发布时间】:2018-12-18 12:09:19
【问题描述】:

我是MVVM architecture 的新手,我只想知道如何在repository classUI (activity/fragment) class 之间进行通信。我遇到了实时数据,这些数据正在执行更新same entities from both (remote and room database) 的工作。

例如: 1)如果我有名为用户的实体。我可以使用如下实时数据保存并观察它:(来自 android 开发者网站)。

    public class UserRepository {
    private final Webservice webservice;
    private final UserDao userDao;
    private final Executor executor;

    @Inject
    public UserRepository(Webservice webservice, UserDao userDao, Executor executor) {
        this.webservice = webservice;
        this.userDao = userDao;
        this.executor = executor;
    }

    public LiveData<User> getUser(String userId) {
        refreshUser(userId);
        // Returns a LiveData object directly from the database.
        return userDao.load(userId);
    }

    private void refreshUser(final String userId) {
        // Runs in a background thread.
        executor.execute(() -> {
            // Check if user data was fetched recently.
            boolean userExists = userDao.hasUser(FRESH_TIMEOUT);
            if (!userExists) {
                // Refreshes the data.
                Response<User> response = webservice.getUser(userId).execute();

                // Check for errors here.

                // Updates the database. The LiveData object automatically
                // refreshes, so we don't need to do anything else here.
                userDao.save(response.body());
            }
        });
    }
}

2) 但是我们如何在不需要实时数据但我只想显示或隐藏进度对话框的其他 API 中做到这一点(登录)取决于网络成功或错误消息。

public void isVerifiedUser(int userId){
      executor.execute(() -> {
        // making request to server for verifying user

        Response<User> response = webservice.getVerifyUser(userId).execute();

          // how to update the UI like for success or error.
          //update the progress dialog also in UI class
        });
}

【问题讨论】:

    标签: java android-room android-architecture-components android-livedata android-mvvm


    【解决方案1】:

    您需要让 isVerifiedUser() 返回一个 liveData,您可以在与该 UI(活动/片段)相关的 viewModel 中观察它。

    1.内部存储库:

    public LiveData<State> isVerifiedUser(int userId){
    
        MutableLiveData<State> isVerified = new MutableLiveData();
    
        executor.execute(() -> {           
            Response<User> response = webservice.getVerifyUser(userId).execute();
            // Update state here.
            isVerified.postValue(valueHere)
        });
    
        return isVerified;
    }
    

    2。视图模型:

     public ViewModel(final Repository repository) {
            //observe userId and trigger isVerifiedUser when userId value is changed
            stateLiveData = Transformations.map(userId, new Function<>() {
                @Override
                public RepoMoviesResult apply(Integer userId) {
                    return repository.isVerifiedUser(userId);
                }
            });
        }
    

    3.活动:

    viewModel.getStateLiveData ().observe(this, new Observer<>() {
        @Override
        public void onChanged(State state) {
             //do something here
        }
    });
    

    更多信息:

    LiveData

    ViewModel

    Guide to app architecture MVVM

    【讨论】:

    • 感谢您的回答。请您解释一下,以便我能够清楚地理解它。
    • @MohamedNiyaz 请阅读我添加的资源。您需要了解它们才能使用此架构。
    • 感谢@Yassin Ajdi 的链接。我已经完成了上述操作,并且非常清楚地了解了架构。但是我对您的存储库代码有疑问,为什么您要传递状态?而不是 int 我如何传递对象变量。
    • @MohamedNiyaz 你可以传递你想要的任何对象作为该方法的参数。重要的是返回值必须是 LiveData 对象,以便您可以在 ViewModel 中观察它
    猜你喜欢
    • 1970-01-01
    • 2011-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-01
    • 1970-01-01
    相关资源
    最近更新 更多