我在使用Android Studio 3.0 IDE在Kotlin中编写.zip Observable时遇到问题。
这是我的代码:
internal var updateStringEventsSubject = PublishSubject.create<String>()
internal var updateIntEventsSubject = PublishSubject.create<Int>()
internal var triggerSave = PublishSubject.create<Boolean>()
internal var triggerStopAndSave = PublishSubject.create<Boolean>()
internal var normalSaveTrigger = triggerSave.debounce(30, TimeUnit.SECONDS)
internal var trigger = Observable.merge(normalSaveTrigger, triggerStopAndSave)
private fun saveEvents(
strings: List<String>,
integers: List<Int>,
someBoolean: Boolean): Boolean {
return true //doesn't matter for now
}
fun temp() {
Observable.zip<List<String>, List<Int>, Boolean, Boolean>(updateStringEventsSubject.buffer(trigger),
updateIntEventsSubject.buffer(trigger),
trigger, { strings: List<String>, integers: List<Int>, someBoolean: Boolean -> saveEvents(strings, integers, someBoolean) })
.subscribe()
}
但是,我的IDE(Android Studio 3.0 RC2)强调.zip运算符并说:
使用提供的参数不能调用以下任何函数。 zip(((observer:Observer!&gt;)→Unit)!,((观察者:观察者!&gt;)→单位)!,((观察者:观察者)→单位)!,((t1:列表,t2:列表,t3:布尔)→布尔)))其中T1 = List,T2 = List,T3 =布尔,R =有趣的zip布尔值(source1:((观察者:观察者)→单位)!,源2 :((观察者:观察者)→单位)!,source3 :((观察者:观察者)→单位)!,拉链:((t1:T1,t2:T2,t3:T3)→R)!):可观察!在io.reactivex.Observable中定义 zip(((observer:Observer!&gt;)→Unit)!,((观察者:观察者!&gt;)→单位)!,((t1:列表,t2:列表)→布尔)!,布尔值)其中T1 = List,T2 = List,R =有趣的zip布尔值(source1:((观察者:观察者)→单位)!,source2:((观察者:观察者)→单位)!,拉链:((t1:T1,t2:T2 )→R)!, delayError:Boolean):可观察!在io.reactivex.Observable中定义 zip(ObservableSource!&gt;!,ObservableSource!&gt;!,ObservableSource!,io.reactivex.functions.Function3!,在List!中,布尔!,out布尔!&gt;!),其中T1 = List,T2 = List, T3 =布尔值,R =有趣的zip布尔值(source1:ObservableSource!,source2:ObservableSource!,source3:ObservableSource!,zipper:Function3!):可观察!在io.reactivex.Observable中定义 zip(ObservableSource!&gt;!,ObservableSource!&gt;!,BiFunction !,在List!中,out Boolean!&gt;!,Boolean),其中T1 = List,T2 = List,R =布局为有趣的zip(source1:ObservableSource! ,source2:ObservableSource!,zipper:BiFunction!,delayError:Boolean):可观察!在io.reactivex.Observable
中定义
如何让它与Kotlin一起使用?
答案 0 :(得分:4)
由于某些原因使用RxJava 1.1.7,它认为显式指定zipper参数的类型为Func3一个冗余的SAM构造函数(它是),并允许您用lambda替换它。但是,使用RxJava 2.1.5,类型更改为Function3,它不再将其识别为具有单个抽象方法的接口(它仍然是)。我不确定为什么会这样。
无论如何,指定拉链功能的类型都可以解决问题:
import io.reactivex.functions.Function3
...
fun temp() {
Observable.zip<List<String>, List<Int>, Boolean, Boolean>(updateStringEventsSubject.buffer(trigger),
updateIntEventsSubject.buffer(trigger),
trigger, Function3 { strings, integers, someBoolean -> saveEvents(strings, integers, someBoolean) } )
.subscribe()
}
注意:我设法让它工作而没有明确指定Function3
的类型参数。它可能取决于您使用的Kotlin或RxJava版本是否可以推断出类型。如果没有,你可以永远更明确:
Function3<List<String>, List<Int>, Boolean, Boolean> { ... }
修改:还有一种更简单的方法:改用io.reactivex.rxkotlin.Observables
。它是一个内联函数,为我们做了丑陋的声明。然后你可以这样做:
import io.reactivex.rxkotlin.Observables
...
Observables.zip(updateStringEventsSubject.buffer(trigger),
updateIntEventsSubject.buffer(trigger),
trigger,
::saveEvents)
答案 1 :(得分:0)
感谢@Joeleski,我发现了一个错误。在我的情况下,我明确指定类型到$s1="INSERT INTO `register_request` (`name`, `dob`, `email`, `mobile`, `address`, `gender`, `id_type`, `password`, `acc_type`, `acc_branch`, `trans_pin`, `open_bal`, `profile_pictures`) VALUES ('$fullName', '$dob', '$email', '$mobnum', '$fullAddress', '$gender', '$idtype', '$pass', '$atype', '$bnkb', '$transpin', '$aob', '$fileNameDb')";
$insert = $mydb->query($s1);
if($insert){
echo 'success';}
else{
echo 'error in database';
}
运算符的每个参数,然后发现一个变量的类型错误。
答案 2 :(得分:0)
可能关注的人......
尝试执行Observable.merge()
解决方案将其更改为Observable.mergeArray()