Función rxjava :: zip devuelve un resultado vacío

Estoy usando Rxjava con mi aplicación, así que puedo search mis datos desde el server de API diferente, para combinar el resultado usando la function "zip" y aquí está mi código: class1: –

var service = retrofit(1).create<cc>(cc::class.java) var service1 = retrofit(0).create<cc>(cc::class.java) var obs: io.reactivex.Observable<JSONResponse> = service.getsky() .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) var result2: io.reactivex.Observable<List<get>> = service1.getTrends() .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) var x:ArrayList<arrayitem> = ArrayList() fun ini_conection() :ArrayList<arrayitem>{ Observable.zip(obs, result2, BiFunction { t1: JSONResponse, t2: List<get> -> Pair(t1, t2) }).subscribe({ for (i in 0..5) { x.add(arrayitem(gson.toJson(it.second.get(i).type))) x.add(arrayitem(gson.toJson(it.first.android?.get(i)?.title))) } for (s in x) { println(s) } }) return x } 

cuando llamo al resultado en ex: class 2 como esta

  val h =Main_con() Log.e("hi i am work", h.ini_conection().toString()) 

el resultado que obtuve fue una list de matriz vacía

aquí también mi class de arrayitem:

 data class arrayitem(var title: String) 

por cierto, en este bucle en la function ini_conection () se imprime normalmente el resultado que se almacena en x arraylist este es el ciclo: –

  for (s in x) { println(s) } 

No puede get el resultado de la synchronization de inmediato. Debe esperar y usualmente solo se puede acceder por callback.

Cuando devuelve x, devuelve una matriz que se inicializa en:

 var x:ArrayList<arrayitem> = ArrayList() 

para get la x que llena el resultado, puede usar la interfaz o lambda para get su resultado.

aquí hay ejemplos usando lambda:

 fun ini_conection(onResult: ArrayList<arrayitem> -> Unit) { Observable.zip(obs, result2, BiFunction { t1: JSONResponse, t2: List<get> -> Pair(t1, t2) }).subscribe({ for (i in 0..5) { x.add(arrayitem(gson.toJson(it.second.get(i).type))) x.add(arrayitem(gson.toJson(it.first.android?.get(i)?.title))) } for (s in x) { println(s) } onResult(x) }) 

}

Y puedes usarlo así:

 val h = Main_con() h.ini_conection({res -> Log.e("Work", res.toString())}) 

necesitas replantear tu código Como señaló @ egon12, primero devolverá x vacío y luego tal vez realice algunas operaciones en esa matriz en el bloque de suscripción.

Hay forms de resolver eso.

  1. el feo, puedes usar Observable.toBlocking() , que te hará ser del reactive code .

  2. Devuelve Observable<ArrayList<arrayitem>> de ini_conection() y suscríbase en otro lugar.

Normalmente, el segundo enfoque sería mejor utilizarlo, ya que podría operar observables y no bloquear.

  • ¿Por qué obtengo una android.os.TransactionTooLargeException en mi aplicación de Android escrita en Kotlin / rxJava cuando salgo de la aplicación? (onExit / onPause)?
  • Tipo de devolución diferente en RxJava 2 (actualización desde RxJava1)
  • ¿Hay alguna manera de orderar las keys groupBy en rx-java / kotlin?
  • ¿Expresar "súper" generics en los types funcionales de Kotlin?
  • Cambiar Observable desde AutoCompleteTextView a EditText
  • Crear un observable común que evite múltiples llamadas
  • Usando RxJava para get un resultado distinto con Realm y Retrofit
  • Llamar a un RxJava Single In Kotlin Lambda
  • Ventana cornetworkingera RxJava
  • Datos de caching de request HTTP en RxJava
  • retryWhen () no llama a lo que está dentro de Observable.just ()