美文网首页
RxJava,retrofit,rxbinding kotlin

RxJava,retrofit,rxbinding kotlin

作者: jianboo | 来源:发表于2020-08-11 09:13 被阅读0次

    环境

    网络请求

    android 9.0之后 不允许使用http请求,可以在application中配置usesCleartextTraffic属性

    <application

        android:name=".MyApplication"

        android:allowBackup="true"

        android:icon="@mipmap/ic_launcher"

        android:label="@string/app_name"

        android:roundIcon="@mipmap/ic_launcher_round"

        android:supportsRtl="true"

        android:theme="@style/AppTheme"

        android:usesCleartextTraffic="true">

        <activity android:name=".MainActivity">

            <intent-filter>

                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />

            </intent-filter>

        </activity>

    </application>

    引用

    implementation 'com.jakewharton.rxbinding4:rxbinding:4.0.0'

    implementation 'com.jakewharton.rxbinding4:rxbinding-core:4.0.0'

    implementation 'com.jakewharton.rxbinding4:rxbinding-appcompat:4.0.0'

    implementation 'com.squareup.retrofit2:retrofit:2.9.0'

    implementation 'com.squareup.retrofit2:converter-gson:2.9.0'

    implementation 'com.squareup.retrofit2:adapter-rxjava3:2.9.0'

    RxJava和retrofit的使用

    多个异步请求

    当使用retrofit和RxJava的时候,经常遇到需要对网络请求的结果进行整理的情况,

    可以使用RxJava中的concatMap连接多个处理请求

    举个栗子:

    客户端需要展示二维码的时候,二维码的内容是从服务端获取的,而创建二维码的过程是个耗时操作,并且执行有先后顺序

    可以使用concatMap

    override fun loadQRCode(): Observable<Bitmap> {

        var qrCodeValueObservable =

            RetrofitClient.getInstance().create(MainPageApi::class.java).getQRCodeValue()

        return qrCodeValueObservable.concatMap {

            return@concatMap Observable.create { emitter: ObservableEmitter<Bitmap> ->

                it?.result.let { result ->

                    QRCodeUtil.createQRCode(object : ResultCallBack<Bitmap> {

                        override fun onSuccess(wrapper: Bitmap) {

                            emitter.onNext(wrapper)

                        }

                        override fun onError(e: Exception) {

                            emitter.onError(e)

                        }

                    }, result?.get(0)?.name)

                }

            }

        }

    }

    循环请求

    在实际应用场景中,会遇到定时刷新的情况,可以使用Rxjava中的repeat

    栗子:

    getModule()?.loop()

        ?.delay(5, TimeUnit.SECONDS, true)//延时5秒

        ?.repeat()//重复请求

        ?.retry()//异常重试

        ?.doOnSubscribe { addDisposable(it) }

        ?.subscribeOn(Schedulers.io())

        ?.observeOn(AndroidSchedulers.mainThread())

        ?.subscribe({

            Log.e("loadLoginState", Date().toString())

        }) {

            Log.e("loadLoginState", it.toString())

        }

    超时请求

    如果执行耗时操作的时候,无论处理结果如何都有一个返回结果,提示超时或者其他文案

    可以使用RxJava中的timeout方法

    *.timeout(Constants.REQUEST_TIME_OUT, TimeUnit.SECONDS)

    rxbinding的使用

    单次点击防抖,3秒内只响应一次

    addDisposable(ivQRCode.clicks().throttleFirst(3, TimeUnit.SECONDS).subscribe { //to do })

    长按事件

    addDisposable(ivQRCode.longClicks().subscribe {

        getP()?.loadQRCode()

    })

    Demo地址

    https://github.com/jianbo1124/RxJavaProject

    相关文章

      网友评论

          本文标题:RxJava,retrofit,rxbinding kotlin

          本文链接:https://www.haomeiwen.com/subject/oyredktx.html