【问题标题】:Android MVVM have view respond to async resultAndroid MVVM 有视图响应异步结果
【发布时间】:2018-01-17 08:33:08
【问题描述】:

我正在创建我的 MVVM 模板项目。 MVVM 的工作方式是 View 观察 VM 的变化并对它们做出反应。我将如何在以下示例中实现该逻辑。

查看代码:

fun addPost(): Unit {
    viewModel.addPost(dataSource.text.get(), dataSource.title.get(), { postID: Long ->
        if (postID.equals(0)) {
            Toast.makeText(MyApp.instance.getContext(), "Error", Toast.LENGTH_LONG).show()
        } else {
            (arguments.get(ARG_RunOnPositiveDismiss) as (DMPost) -> Unit)(DMPost(postID, MyOptions.User.GET()!!.UserID, dataSource.title.get(), dataSource.text.get()))
            dismiss()
        }
    })
}

ViewModel 代码:

fun addPost(title:String,text:String,onSuccess: (Long) -> Unit): Unit {
        rep.insertPost(DMPost(0, MyOptions.User.GET()!!.UserID, title, text),onSuccess)
}

存储库代码:

fun insertPost(post: DMPost, onSuccess: (Long) -> Unit) {
    if (MyOptions.Online.GET()!!) {
        val client = retrofit.create(APIPost::class.java)
        val insertPost: Call<Long> = client.insertPost(post)
        insertPost.enqueue(object : Callback<Long> {
            override fun onResponse(call: Call<Long>, response: Response<Long>) {
                if (response.isSuccessful) {
                    onSuccess(response.body()!!)
                } else {
                    onSuccess(0)
                }
            }

            override fun onFailure(call: Call<Long>, t: Throwable) {
                onSuccess(0)
            }
        })

    } else {
        AsyncTask.execute {
            try {
                onSuccess(daoPost.insertPost(EntityPost(post)))
            } catch (e: Exception) {
                onSuccess(0)
            }
        }
    }
}

我假设我需要在我的视图中有 2 种方法,一种用于显示错误 toast,另一种用于成功。视图应观察 VM 上的值以及该值的更改,应调用其中之一这两种方法。

我的假设对吗? 如果是,有人可以为该逻辑编写代码吗?

【问题讨论】:

    标签: android mvvm architecture kotlin


    【解决方案1】:

    在您的视图模型中:

    private MediatorLiveData<YourDataType> mDataObserved;
    public LiveData<YourDataType> getDataObserved(){
        return mDataObserved;
    }
    

    在你看来:

    viewModel.getDataObserved().observer(this, Observer<YourDataType>{
        // do update view logic in here
    });
    

    最后,在您的存储库回调调用 viewmodel 以通知数据更改:

    mDataObserved.postValue(YourDataValue);
    

    【讨论】:

    • 你能给我一个 rxJava 的例子吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-13
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多