为了账号安全,请及时绑定邮箱和手机立即绑定

将代码重构为 RxJava、循环位置和数组列表

将代码重构为 RxJava、循环位置和数组列表

暮色呼如 2021-11-17 10:43:34
我仍在学习 RxJava,我知道什么是 Observable 和 Observers 的基本知识,但仍然困惑如何、何时何地使用过滤器、地图、平面图等您有什么好的建议如何将此代码转换为 RxJava 吗?void locationChanged(LocationResult locationResult) {        for (Location location : locationResult.getLocations()) {        Double lat = location.getLatitude();        Double lng = location.getLongitude();        boolean isMock;        if (Build.VERSION.SDK_INT >= 18) {            isMock = location.isFromMockProvider();        } else {            isMock = !Settings.Secure.getString(getContentResolver(), Settings.Secure.ALLOW_MOCK_LOCATION).equals("0");        }        for (int k = 0; k < offices.size(); k++) {            Office office = offices.get(k);            Double d_lat = Double.valueOf(office.getOc_lat());            Double d_long = Double.valueOf(office.getOc_long());            Double d_radius = Double.valueOf(office.getOc_radius());            Location.distanceBetween(lat, lng, d_lat, d_long, resultApi);            String s_distanceToOffice = String.valueOf(resultApi[0]);            Double d_distanceToOffice = Double.parseDouble(s_distanceToOffice);            //Log.e(TAG, "locationChanged: Distance -> " + d_distanceToOffice);            // check-in in radius            if (d_distanceToOffice < d_radius) {                buttonOutOfRadius.setVisibility(View.GONE);                progressBarPosition.setVisibility(View.GONE);哪些代码需要更改而无需更改?我做过这样的事情:Observable.fromIterable(offices)                    .subscribeOn(Schedulers.io())                    .observeOn(AndroidSchedulers.mainThread())                    .subscribe()我是否需要将循环“for(..)”中的代码复制粘贴到“oNext(Office office)”中?很高兴从您的经验中得知。
查看完整描述

1 回答

?
GCT1015

TA贡献1827条经验 获得超4个赞

几天后,我获得了将其重构为 Rx 的良好流程,


这是我在 kotlin 中的代码,易于阅读,如果您有更好的替代方案,请分享给我


private fun locationChanged(locationResult: LocationResult) {

    for (location in locationResult.locations) {


        val lat = location.latitude

        val lng = location.longitude

        var dDistanceToOffice: Double

        var dRadius: Double


        Observable.fromIterable(offices)

                .subscribeOn(Schedulers.newThread())

                .filter {

                    val dLat = it.oc_lat!!.toDouble()

                    val dLong = it.oc_long!!.toDouble()

                    dRadius = it.oc_radius!!.toDouble()


                    // Check the distance "MyLocation" to "OfficeLocation"

                    Location.distanceBetween(lat, lng, dLat, dLong, resultApi)

                    val sDistanceToOffice = resultApi[0].toString()

                    dDistanceToOffice = sDistanceToOffice.toDouble()


                    dDistanceToOffice < dRadius

                }

                .observeOn(AndroidSchedulers.mainThread())

                .subscribe(object : Observer<Office> {

                    override fun onSubscribe(d: Disposable) {

                        disposable = d

                    }


                    override fun onNext(office: Office) {

                        inArea = "Y"

                        siteName = office.oc_site

                        siteId = office.oc_id

                        siteLat = office.oc_lat!!

                        siteLong = office.oc_long!!

                    }


                    override fun onError(e: Throwable) {

                        Log.e(TAG, "locationChanged() Error: ${e.message}")

                    }


                    override fun onComplete() {

                        // checking the data in Area = N or Y

                        if (isMock(location)) {

                            processTheMock()

                        } else {

                            if (inArea == "Y") {

                                hideButtonOutRadius()

                                hideProgressbarPosition()

                                showButtonCheckin()

                                processNoMock(lat, lng, "In Radius", siteName!!)

                            } else {

                                retrofitGoogleGeocoding(lat, lng)

                                inArea = "N"

                                siteName = newAddress

                                siteLat = lat.toString()

                                siteLong = lng.toString()

                                hideButtonOutRadius()

                                hideProgressbarPosition()

                                showButtonCheckin()

                                processNoMock(lat, lng, "In Radius", siteName!!)

                            }

                        }

                        stopLocationUpdates()

                    }

                })

    } // end of location

}



查看完整回答
反对 回复 2021-11-17
  • 1 回答
  • 0 关注
  • 178 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信