Retrofit2+Rxjava-Rxjava2.x-篇二-依次

作者: MonkeyLei | 来源:发表于2019-08-01 17:24 被阅读1次

继续上一篇之后 MonkeyLei:Retrofit2+Rxjava-Rxjava2.x-篇一-用起来 ,上篇简单的对网络请求做了实践,过程对上下游线程,对线程切换,以及map/flatmap的简单做了了解。然后对RxJava1.x和RxJava2.x的区别那些也做了了解,相关的链接,官方的/网友的都是小萌新忒么搬来的,O(∩_∩)O哈哈~

小萌新上一篇还想这样:就是知识看的太少了,不知道咋整。。。

image

实际上,群友都告诉我说,你要么再封装一层Observable,当然也可以用操作符map/flatmap这些来做链式处理!所以可能可能要纠正下之前的说法!

map看看呢!

  .observeOn(Schedulers.io())  // 还可以指定一个io线程, 用map的形式进行预处理
                .map(object: Function<List<Repo>, List<Repo>>{
                    override fun apply(t: List<Repo>): List<Repo> {
                        Log.e("observable map", "flatMap thread'name=" + Thread.currentThread().name)
                        return t
                    }
                })

flatMap看看呢? - 链表List<Repo>我们可以做一些特殊,甚至是耗时处理

  .observeOn(Schedulers.io()) // 上一次请求的结果回调中,我们还是拿来在io线程中做预处理 
  .flatMap(object: Function<List<Repo>, ObservableSource<List<Repo>>>{
                    override fun apply(t: List<Repo>): ObservableSource<List<Repo>> {
                        // 这里是io线程,可以做一些耗时操作,然后返给onNext的UI线程
                        Log.e("observable", "flatMap thread'name=" + Thread.currentThread().name)
                        // 原样的给返回去
                        return Observable.fromArray(t);
                    }
                })

你要注意,这种线程指定与处理成对出现!map/flatMap处理后,之后你可以切换到UI线程:

   .observeOn(AndroidSchedulers.mainThread()) // 请求都完成后,切换到UI线程,将结果进行渲染 

然后就可以进行subscribe的一个订阅,此时请求启动!这种逻辑小萌新要注解熟悉,当然可能重要的是看人家如何设计的,思想应该更重要一些

Rxjava Retrofit okhttp 依次执行多个请求

https://blog.csdn.net/oneblue123/article/details/79784620

RxJava2源码解读之 Map、FlatMap

从上面来看,我们此时应该就可以利用flatMap再次做请求了,(返回值是Observable)。 map是不行的啦,map不能返回ObservableSource!

直接上代码如何:

GitHubService.kt

    @GET("users/{user}/repos")
    fun listReposStringRxJavaObservable(@Path("user") user: String): Observable<List<Repo>>

Main3Activity.kt

package com.hl.rxnettest

import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import io.reactivex.Observable
import io.reactivex.ObservableSource
import io.reactivex.Observer
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
import io.reactivex.functions.Function
import io.reactivex.schedulers.Schedulers
import retrofit2.Retrofit
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory
import retrofit2.converter.gson.GsonConverterFactory

class Main3Activity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main3)

        // 老样子,再来过一遍Retrofit请求流程

        // 1\. 创建Retrofit实例
        var retrofit = Retrofit.Builder()
                .baseUrl("https://api.github.com/")
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .addConverterFactory(GsonConverterFactory.create())
                .build()

        // 2\. 创建一个请求服务实例
        var gitHubService = retrofit.create(GitHubService::class.java)

        // 3\. 获取服务对应的请求实例
        var gitCall = gitHubService.listReposStringRxJavaObservable("FanChael")

        // 4.1 进行基本请求 - 指定上下游所在线程
        var dis = gitCall.subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe { t ->
                    //lamba表達式走起
                    for (item in t!!) {
                        // SuperStartElectronic subtitle display - 电子字幕展示-接机、演唱会、见面、展示专用.https://github.com/FanChael/SuperStart
                        // Log.e("observable", item.name + item.description + item.html_url)
                    }
                }

        // 4.2 有时候,我们需要连续做两次请求,比如提交订单成功后,然后调起支付接口(至于后续支付结果干什么,暂时不管!)
        // 如果我们不采用map,flatmap等操作符来做连续请求的话,按照小萌新之前的写法就是在第一次onNext成功回调里面,再次发起一次subscribe请求,同样的请求代码还会再写一次!
        // 而RxJava已经考虑到了这一点,为我们准备了更方便的操作符。这里就拿flatmap为例?
        // --flatmp需要返回的是一个ObservableSource,这时候就返回上游的observable对象
        // let'start
        gitCall.subscribeOn(Schedulers.io())
                .observeOn(Schedulers.io()) // 由于请求结果还需要拿来再做一次网络请求,因此我们再次放到io下线程中处理
                .flatMap(object: Function<List<Repo>, ObservableSource<List<Repo>>>{
                    override fun apply(t: List<Repo>): ObservableSource<List<Repo>> {
                        // 在进行一次请求 - 小萌新就将就重复调用了
                        // TODO t可以拿来作为再次请求时的的参数
                        Log.e("observable apply1", t.get(0).name)
                        Log.e("observable", "flatMap thread'name=" + Thread.currentThread().name)
                        return gitHubService.listReposStringRxJavaObservable("FanChael")
                    }
                })
                .observeOn(Schedulers.io()) // 上一次请求的结果回调中,我们还是拿来在io线程中做第三次请求
                .flatMap(object: Function<List<Repo>, ObservableSource<List<Repo>>>{
                    override fun apply(t: List<Repo>): ObservableSource<List<Repo>> {
                        // 在进行一次请求 - 小萌新就将就重复调用了
                        // TODO t可以拿来作为再次请求时的的参数
                        Log.e("observable apply2", "ttt")
                        Log.e("observable", "flatMap thread'name=" + Thread.currentThread().name)
                        return gitHubService.listReposStringRxJavaObservable("FanChael")
                    }
                })
                .observeOn(Schedulers.io()) // 上一次请求的结果回调中,我们还是拿来在io线程中做预处理
                .flatMap(object: Function<List<Repo>, ObservableSource<List<Repo>>>{
                    override fun apply(t: List<Repo>): ObservableSource<List<Repo>> {
                        // 这里是io线程,可以做一些耗时操作,然后返给onNext的UI线程
                        Log.e("observable", "flatMap thread'name=" + Thread.currentThread().name)
                        // 原样的给返回去
                        return Observable.fromArray(t);
                    }
                })
                .observeOn(AndroidSchedulers.mainThread()) // 请求都完成后,切换到UI线程,将结果进行渲染
                .subscribe(object : Observer<List<Repo>>{
                    override fun onComplete() {
                    }

                    override fun onSubscribe(d: Disposable) {
                    }

                    override fun onNext(t: List<Repo>) {
                        Log.e("observable onNext", t[0].name)
                    }

                    override fun onError(e: Throwable) {
                    }
                })

    }
}

老样子,依赖别忘:

    implementation 'com.squareup.retrofit2:retrofit:2.6.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.6.0'
    implementation 'com.squareup.retrofit2:adapter-rxjava:2.6.0'

    // 最新支持rxjava2的适配器 https://github.com/square/retrofit/tree/master/retrofit-adapters/rxjava2
    implementation 'com.squareup.retrofit2:adapter-rxjava2:2.6.0'

    // https://github.com/ReactiveX/RxAndroid
    // https://github.com/ReactiveX/RxJava
    implementation "io.reactivex.rxjava2:rxjava:2.2.9"
    implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'

结果:

06-20 14:34:43.005 8154-8161/? E/zygote64: Failed sending reply to debugger: Broken pipe
06-20 14:34:44.911 8154-8186/com.hl.rxnettest E/observable apply1: banner
06-20 14:34:44.911 8154-8186/com.hl.rxnettest E/observable: flatMap thread'name=RxCachedThreadScheduler-3
06-20 14:34:45.469 8154-8187/com.hl.rxnettest E/observable map: flatMap thread'name=RxCachedThreadScheduler-4
06-20 14:34:45.470 8154-8188/com.hl.rxnettest E/observable apply2: ttt
06-20 14:34:45.470 8154-8188/com.hl.rxnettest E/observable: flatMap thread'name=RxCachedThreadScheduler-5
06-20 14:34:46.075 8154-8189/com.hl.rxnettest E/observable: flatMap thread'name=RxCachedThreadScheduler-6
06-20 14:34:46.076 8154-8154/com.hl.rxnettest E/observable onNext: banner

这里需要注意的是, flatMap并不保证事件的顺序 - 如果需要保证顺序则需要使用concatMap

给初学者的RxJava2.0教程(三)

不是搬砖,胜似搬砖! - 小萌新还是很努力的,就是努力的有点慢,努力的有点坑!

相关文章

  • Retrofit2+Rxjava-Rxjava2.x-篇二-依次

    继续上一篇之后 MonkeyLei:Retrofit2+Rxjava-Rxjava2.x-篇一-用起来 ,上篇简单...

  • 依次类推

    七月的天有着七色的梦,我于时间从七月开始,晓晨初上,有了第一缕阳光,美好而又自然。20多年间东南西北闯了一圈,还是...

  • 依次处理

    深秋,雨夜,乱葬岗。 他取下斗笠,凝视黑暗中的一切。 “既然来了,还等什么呢?”他问。 “你已经杀了那么多的天下第...

  • Retrofit2+Rxjava-Rxjava2.x-篇一-用起

    从Retrofit基本用法MonkeyLei:Retrofit+Rxjava-以自己的方式重头开始-入门篇 -> ...

  • JavaScript#189:数组--(旋转数组)Rotate

    方法一:把前面的元素依次移到尾部 方法二:把尾部元素依次移到首部

  • 依次打印二叉树

    今天做了两题,是同一个系列,都是打印二叉树中的值,不同之处在于一个分层一个不分层。很典型的BFS的解法。关键点基本...

  • 图片依次加载

    废话不多说直接当代码1、html 2、js

  • composer 报 Failed to decode resp

    造成这个问题的原因有好多,可以依次试试下列方法 方法一 从上往下依次执行 方法二 修改 php.ini 文件(./...

  • 关于自学的这点事儿

    本文是李笑来老师的「把时间当作朋友」的第二篇读书笔记. 内容依照书中的结构依次是阅读理解 - 检索能力 - 写作能...

  • python十进制正数、负数、小数和二进制互相转换

    二进制数转十进制数 整数二进制用数值乘以2的幂次依次相加,小数二进制用数值乘以2的负幂次然后依次相加! 二进制正数...

网友评论

    本文标题:Retrofit2+Rxjava-Rxjava2.x-篇二-依次

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