Я продолжаю получать нулевое значение, несмотря на присвоение ему значения - PullRequest
0 голосов
/ 20 апреля 2019

Я хочу назначить ответ API на список глобальных массивов в Kotlin, но массив остается пустым вне функции handleResponse вар одноразовый: одноразовый? = ноль lateinit var mMap: GoogleMap var sensorData = ArrayList ()

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_maps)
    // Obtain the SupportMapFragment and get notified when the map is ready to be used.

    showReading("Jxh7GGbk5S5KaBcnlQ4vUw")
    val mapFragment = supportFragmentManager
        .findFragmentById(R.id.map) as SupportMapFragment
    mapFragment.getMapAsync(this)

}
fun showReading(token: String) {

    disposable = client.sensorData(token)
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(this::handleResponse)

}
fun handleResponse(sensorData: SensorNode) {

    this.sensorsData.add(sensorData)
    Log.d("SENSOR DATA", "" + sensorsData.get(0)) // Works
}
override fun onMapReady(googleMap: GoogleMap) {
    mMap = googleMap
    Log.d("SENSOR DATA", "" + sensorsData.get(0)) // Return Null
    val sensor = LatLng(-6.8, 39.0)
    mMap.addMarker(MarkerOptions().position(sensor).title("Sensor Node 1"))
}
override fun onPause() {
    super.onPause()
    disposable?.dispose()
}

1 Ответ

1 голос
/ 20 апреля 2019

Проблема в том, что showReading и mapFragment.getMapAsync - это два асинхронных вызова, поэтому у вас нет гарантии, какой из них завершится первым.Самый быстрый способ справиться с этим - запустить их одновременно и подождать, пока оба завершены, а затем действовать.

Если вы хотите использовать парадигму реактивных потоков, вы можете сделать следующее:

  Single.create<GoogleMap> { emitter ->
            map.getMapAsync { emitter.onSuccess(it) }
        }.zipWith(sensorData(token), BiFunction<GoogleMap, SensorNode, Unit> { map, node -> 
            //do what you want with map and sensordata
        })
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(this::handleResponse)
...