【问题标题】:observe a single element from the array观察数组中的单个元素
【发布时间】:2020-09-20 18:46:32
【问题描述】:

我在这里遇到了两个代码问题,

  1. 如何创建一个可以观察单个数组项而不是整个数组的观察者。

  2. AndroidSchedulers.mainThread() 抛出错误

    override fun onCreate(savedInstanceState: Bundle?) {
    
     super.onCreate(savedInstanceState)
     setContentView(R.layout.activity_main)
    
     val greetings = arrayOf("Hello A", "Hello B", "Hello C")
    
     val observable = Observable.fromArray(greetings)
    
     val observer = object: DisposableObserver<Array<String>>() {
         override fun onNext(t: Array<String>?) {
             println(t)
         }
    
         override fun onError(e: Throwable?) {
    
         }
    
         override fun onComplete() {
    
         }
     }
    
     observable.subscribeOn(Schedulers.io())
             .observeOn(AndroidSchedulers.mainThread())
             .subscribeWith(observer)
    

    }

来自 #2 的错误

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.fromarraydemo, PID: 11002
    java.lang.NoSuchMethodError: No static method metafactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; in class Ljava/lang/invoke/LambdaMetafactory; or its super classes (declaration of 'java.lang.invoke.LambdaMetafactory' appears in /apex/com.android.art/javalib/core-oj.jar)
        at io.reactivex.rxjava3.android.schedulers.AndroidSchedulers.<clinit>(AndroidSchedulers.java:33)
        at io.reactivex.rxjava3.android.schedulers.AndroidSchedulers.mainThread(AndroidSchedulers.java:44)
        at com.example.fromarraydemo.MainActivity.onCreate(MainActivity.kt:36)

尝试#1

val observer = object: DisposableObserver<String>() {
    override fun onNext(t: String?) {
        TODO("Not yet implemented")
    }

    override fun onError(e: Throwable?) {
        TODO("Not yet implemented")
    }

    override fun onComplete() {
        TODO("Not yet implemented")
    }

}

但是.subscribeWith(observer) 有问题

Type mismatch: inferred type is <no name provided>! but Observer<in Array<String>!>! was expected

【问题讨论】:

  • 你想观察单个值那为什么不直接用 Observable.just(array[index]) 创建一个 observable 呢?
  • 哦,对不起,我的意思是我想遍历数组的所有值,并希望在“onNext”上观察每个值
  • 我不明白你为什么要观察不可变数组?

标签: android kotlin rx-java rx-android


【解决方案1】:

关于错误#1,我认为有一个功能

val observable = greetings.toObservable()

这似乎可以满足您的需求(与您的尝试一起使用 DisposableObserver&lt;String&gt;

关于错误 #2,我复制粘贴了您的代码,但在 AndroidSchedulers.mainThread() 上没有收到任何错误,但我使用的是 rxjava2,所以情况并不完全相同。 (我在这里所做的唯一更改是从 String 和 Throwable 中删除可选)

也许如果你没有找到更好的解决方案,回到 rxjava2 可以是一个选择吗?

【讨论】:

    【解决方案2】:
    Based on @AppDeveloper's comment,
    
    "i mean i want to iterate through all values for the array and want on observe each one on the 'onNext'"
    

    您可以使用
    fromIterable()来弹出这个数组中的每个值,并在onNext()上观察每个值;
    fromArray()是弹出整个数组。

    Observable.fromIterable(arrays)
           .subscribeOn(SchedulerProvider.io())
           .observeOn(SchedulerProvider.mainThread())
           .subscribe(
               {TODO("do on Next")},
               {TODO("do on Error")}
            )
    
    

    【讨论】:

      猜你喜欢
      • 2020-02-08
      • 2018-11-26
      • 2022-01-23
      • 2019-04-26
      • 1970-01-01
      • 2014-01-28
      • 1970-01-01
      • 1970-01-01
      • 2012-06-30
      相关资源
      最近更新 更多