- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经根据最新的 Google 架构指南开发了示例项目,
我有一个 fragment 。
MainFragment.kt
MainViewModel
接收数据LiveData
并更新运行良好的 UIMainViewModel.kt
MutableLiveData<User>
用户,每当我更新用户时,我的观察者在 MainFragment
接到电话,我正在更新 UI(工作正常)现在我的问题是?
在我的 MainActivity
我加载了两个 fragment ,MainFragment
& SecondaryFragment
.
SecondFragment.KT
获取用户数据现在如何从 Repository.kt 通知 MainViewModel 我有最新数据要更新?
RXJava
吗?从 Repository.KT
传递数据至 MainViewModel.KT
,那么我该如何使用它来传递用户数据呢?最佳答案
让我们分部分来:
Now how do I notify from Repository.kt to MainViewModel that I have latest data to update ?
您可以使用观察者模式,就像您从 MainViewModel 到 UI 使用的模式一样。如果你使用改造,你可以使用调用适配器从你的改造调用中返回 RxJava 的 Observables(或 Singles,Flowables 等等),所以例如你可以有这样的东西:
@Headers({"Content-Type: application/json", "Accept: application/json"})
@POST("/sign_in")
Single<Response<LoginResponse>> traditionalLoginUser(
@Body LoginRequest request,
@Header("Authorization") String authToken);
这是一个典型的 Retrofit 接口(interface),它返回一个 Single,然后您可以在您的存储库中观察这个 Single 或简单地将它传递给 ViewModel 以在那里观察。
您还可以为 LiveData 添加一个调用适配器(google 实现了一个 here )并使用 LiveData 而不是 RxJava。不过,我个人不喜欢在网络层使用 LiveData。
do I need to use RXJava to pass the data from Repository.KT to MainViewModel.KT, in that case how do I use it to pass user data?
你可以使用 RxJava,是的。实际上,我一直在开发一个完全可以做到这一点的示例应用程序。基本思想是您使用存储库从 API 获取数据并将 Observable 传递给 ViewModel。我喜欢在 ViewModel 中做的是通过订阅其中的可观察对象(或其他 rx 实体)并接收数据来处理任何可能的错误。由于我们不一定像处理 RxJava 那样处理 LiveData 上的错误,我们可以包装 LiveData 以将错误传播到 View 作为我们包装器的状态(这实际上可以在这个 google sample 中找到)。
例如,在我的存储库中我有这个:
fun getUsersNotPaged(page: Int, pageSize: Int): Single<SOResponse<User>> {
return remoteDataSource.apiService.getTopUsers(page, pageSize)
}
然后在我的 View 模型中我这样做:
var userList: MutableLiveData<LiveResource<SOResponse<User>>> = MutableLiveData()
fun getUserListNotPaged(page: Int, pageSize: Int): MutableLiveData<LiveResource<SOResponse<User>>> {
val result = usersRepository
.getUsersNotPaged(page, pageSize)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({ result ->
userList.postValue(LiveResource(LiveResourceStatus.SUCCESS, result, null))
}, { error ->
userList.postValue(LiveResource(LiveResourceStatus.ERROR, null, error.localizedMessage))
})
return userList
}
在我看来:
viewModel.getUserListNotPaged(1, 20).observe(this, Observer {
it?.data?.let {
Toast.makeText(this.context, "Here", Toast.LENGTH_SHORT).show()
}
})
我使用 LiveResource 来包装我的 RxJava 响应和错误。
您还可以使用 ReactiveStrems
扩展将 Rx Publisher
转换为 LiveData
,但您需要处理错误时的情况发生在 ViewModel
中,并保证生成的 LiveData
没有错误。像这样:
fun getUserListNotPaged(page: Int, pageSize: Int): LiveData<SOResponse<User>> {
val result = usersRepository
.getUsersNotPaged(page, pageSize)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.onErrorReturn {
SOResponse<User>()
}
.toFlowable()
return LiveDataReactiveStreams.fromPublisher(result)
}
在这种情况下,每当出现错误时,我都会返回一个空响应。
Does Android Latest Architecture do support any observer to accomplish this?
是的,如您所见,您可以在整个过程中的所有地方或仅在过程中使用 LiveData
(仅从 VM 到 UI)。有些人不同意在 HTTP 调用中使用 LiveData
though (我是其中之一,哈哈)。
关于android - 关于谷歌最新架构指南的 MVVM 模式,如何将数据(通知)从存储库类传递到模型 View 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50618369/
Github:https://github.com/jjvang/PassIntentDemo 我一直在关注有关按 Intent 传递对象的教程:https://www.javacodegeeks.c
我有一个 View ,其中包含自动生成的 text 类型的 input 框。当我单击“通过电子邮件发送结果”按钮时,代码会将您带到 CalculatedResults Controller 中的 Em
我有一个基本的docker镜像,我将以此为基础构建自己的镜像。我没有基础镜像的Dockerfile。 基本上,基本镜像使用两个--env arg,一个接受其许可证,一个选择在容器中激活哪个框架。我可以
假设我想计算 2^n 的总和,n 范围从 0 到 100。我可以编写以下内容: seq { 0 .. 100 } |> Seq.sumBy ((**) 2I) 但是,这与 (*) 或其他运算符/函数不
我有这个网址: http://www.example.com/get_url.php?ID=100&Link=http://www.test.com/page.php?l=1&m=7 当我打印 $_G
我想将 window.URL.createObjectURL(file) 创建的地址传递给 dancer.js 但我得到 GET blob:http%3A//localhost/b847c5cd-aa
我想知道如何将 typedef 传递给函数。例如: typedef int box[3][3]; box empty, *board[3][3]; 我如何将 board 传递给函数?我
我正在将一些代码从我的 Controller 移动到核心数据应用程序中的模型。 我编写了一个方法,该方法为我定期发出的特定获取请求返回 NSManagedObjectID。 + (NSManagedO
为什么我不能将类型化数组传递到采用 any[] 的函数/构造函数中? typedArray = new MyType[ ... ]; items = new ko.observableArray(ty
我是一名新的 Web 开发人员,正在学习 html5 和 javascript。 我有一个带有“选项卡”的网页,可以使网页的某些部分消失并重新出现。 链接如下: HOME 和 JavaScript 函
我试图将对函数的引用作为参数传递 很难解释 我会写一些伪代码示例 (calling function) function(hello()); function(pass) { if this =
我在尝试调用我正在创建的 C# 项目中的函数时遇到以下错误: System.Runtime.InteropServices.COMException: Operation is not allowed
使用 ksh。尝试重用当前脚本而不修改它,基本上可以归结为如下内容: `expr 5 $1 $2` 如何将乘法命令 (*) 作为参数 $1 传递? 我首先尝试使用“*”,甚至是\*,但没有用。我尝试
我一直在研究“Play for Java”这本书,这本书非常棒。我对 Java 还是很陌生,但我一直在关注这些示例,我有点卡在第 3 章上了。可以在此处找到代码:Play for Java on Gi
我知道 Javascript 中的对象是通过引用复制/传递的。但是函数呢? 当我跳到一些令人困惑的地方时,我正在尝试这段代码。这是代码片段: x = function() { console.log(
我希望能够像这样传递参数: fn(a>=b) or fn(a!=b) 我在 DjangoORM 和 SQLAlchemy 中看到了这种行为,但我不知道如何实现它。 最佳答案 ORM 使用 specia
在我的 Angular 项目中,我最近将 rxjs 升级到版本 6。现在,来自 npm 的模块(在 node_modules 文件夹内)由于一些破坏性更改而失败(旧的进口不再有效)。我为我的代码调整了
这个问题在这里已经有了答案: The issue of * in Command line argument (6 个答案) 关闭 3 年前。 我正在编写一个关于反向波兰表示法的 C 程序,它通过命
$(document).ready(function() { function GetDeals() { alert($(this).attr("id")); } $('.filter
下面是一个例子: 复制代码 代码如下: use strict; #这里是两个数组 my @i =('1','2','3'); my @j =('a','b','c'); &n
我是一名优秀的程序员,十分优秀!