Tag: 可观察

从Observable获取结果 – Kotin Android

我有一个方法返回Observable,如下所示: fun currentLocation(): Observable<LatLngFix> { if (GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(context) != ConnectionResult.SUCCESS || !context.isLocationPermissionGranted()) { return getDefaultLocation() } // lastKnownLocation returns location or complete without result // in the latter case, return default unknown location return Observable .concat(locationProvider.lastKnownLocation.map { val latLng = LatLngFix(it.latitude, it.longitude) return@map latLng }, getDefaultLocation()) .onErrorResumeNext { getDefaultLocation() } .first() } 然后当我调用这个函数,我想获得latlng变量。 所以我需要订阅的Observable oviously,但不知道为什么,下面给出了一个错误: localisationService.currentLocation().subscribe(latLng […]

合并来自不同Observable的数据,并根据数据可用性选择不同的获取策略

我有一种情况,通过获取一个Item对象,三件事情之一应该发生: 如果该项目不存在于缓存(又名为空)中,则从api1和api2加载数据,合并数据并返回一个Observable 。 如果该项目存在于缓存中,但缺少api2 ,则从api2加载数据,并将其与高速缓存中已有的数据合并 如果整个数据在缓存中可用,只需返回它。 到目前为止,这是我设法提出的最好的: val cacheObservable = cache.fetchItem(itemId); val api1Observable = api1.fetchItem(itemId); val api2Observable = api2.fetchItem(itemId); val resultObservable = cacheObservable!!.flatMap { item: Item? -> if (item == null) { /* Get the item data, and the full text separately, then combine them */ Observable.zip(api1Observable, api2Observable, { itemData, itemText -> itemData.apply { text […]

kotlin接口能缓存一个值吗?

我真的很喜欢在Kotlin中使用接口的默认实现,尤其是像Observable这样的常见模式。 这是我的界面, interface Observable<T>{ // How do I cache this? val observers: MutableList<Observer<T>> get() = LinkedList<>() fun addObserver(o:Observer<T>){ observers.add(o) } fun removeObserver(o:Observer<T>){ observers.remove(o) } fun notifyObservers(u:T){ for (o in observers){ o.update(u) } } } 接口引用一个observers列表,但get()调用每次都返回一个新的LinkedList() 。 我如何缓存observers的价值,使它只创建一次? 我尝试过使用kotlin-lazy ,但是无法获得正确的语法,或者它不适用于接口。 我的IDE抱怨“委托属性不允许在接口。” UPDATE 基于Yoav的回答,我已经改变了我的界面 interface Observable<T>{ val observers: MutableList<Observer<T>> } 然后在实施课上, class MyObservable : Observable<String> private val […]

我如何使用视图模型,用sqlite和广播接收器来更新UI?

我有一个用于测试连接的应用程序,它有一个20分钟的警报,并且必须使用唯一代码联系服务器,并且服务器使用相同的代码发送一个短信来确认。 我有所有的组件工作,但我不知道如何得到唯一的代码来自动更新在用户界面。 警报把每个请求写入一个sqlite数据库,我希望用observable自动更新UI。 如果这有什么不同,我的项目在Kotlin。 基本上,我只是没有搞清楚如何“观察”的SQL数据库的变化,或如何让广播接收机和活动使用相同的可观察

Observable属性允许在运行时添加观察者

通过Delegates.observable ,Kotlin允许可观察的属性。 但是,我需要在运行时添加观察者的能力,就像Java的Observable类一样。 我现在拥有的是: import java.util.* import kotlin.reflect.KProperty import kotlin.reflect.KProperty0 import kotlin.reflect.jvm.isAccessible class MyObservable<T> (var v: T): java.util.Observable() { operator fun getValue(thisRef: Any, prop: KProperty<*>) = v operator fun setValue(thisRef: Any, prop: KProperty<*>, newValue: T) { v = newValue setChanged() notifyObservers() } } fun <T> addObserver(prop: KProperty0<T>, observerFn: (T) -> Unit) = (prop.apply{ isAccessible = […]

RxJava Kotlin如何从单个可观察<String>中获得分离的对象

RxJava Kotlin平面图不会从分割的字符串中返回分离的对象。 相反,它返回列表 val source: Observable<String> = Observable.just("521934/2342/FOXTROT") .flatMap{Observable.fromArray(it.split("/"))} .subscribe{Log.d(TAG, "$it")} 它返回列表: [521934, 2342, FOXTROT] 但书( Thomas Nield:学习RxJava / 2017 /页114 )说,它必须返回分离的字符串 521934 2342 FOXTROT 书中的例子 http://reactivex.io/documentation/operators/flatmap.html表示它返回Single对象。 在我的情况下,我得到单列表对象。 所以,文件说的是真的。 但是我想要得到结果如书中的例子! 我如何拆分列表并获得分离的对象?

Android数据绑定与Kotlin,BaseObservable和一个自定义委托

我正在尝试编写一个自定义的委托,它将清理Kotlin类中数据绑定的语法。 这将消除需要为每个我想要观察的属性定义一个自定义getter和setter。 Kotlin的标准实现如下所示: class Foo : BaseObservable() { var bar: String @Bindable get() = bar set(value) { bar = value notifyPropertyChanged(BR.bar) } } 显然,这个类有很多属性可以变得相当冗长。 我想要的是将其抽象成如下代表: class BaseObservableDelegate(val id: Int, private val observable: BaseObservable) { @Bindable operator fun getValue(thisRef: Any, property: KProperty<*>): Any { return thisRef } operator fun setValue(thisRef: Any, property: KProperty<*>, value: Any) { […]