日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

retrofit 会请求两次_Retrofit2+Rxjava-Rxjava2.x-篇二-依次执行多个请求-flatMap/map

發布時間:2024/9/15 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 retrofit 会请求两次_Retrofit2+Rxjava-Rxjava2.x-篇二-依次执行多个请求-flatMap/map 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

繼續上一篇之后 MonkeyLei:Retrofit2+Rxjava-Rxjava2.x-篇一-用起來 ,上篇簡單的對網絡請求做了實踐,過程對上下游線程,對線程切換,以及map/flatmap的簡單做了了解。然后對RxJava1.x和RxJava2.x的區別那些也做了了解,相關的鏈接,官方的/網友的都是小萌新忒么搬來的,O(∩_∩)O哈哈~

小萌新上一篇還想這樣:就是知識看的太少了,不知道咋整。。。

實際上,群友都告訴我說,你要么再封裝一層Observable,當然也可以用操作符map/flatmap這些來做鏈式處理!所以可能可能要糾正下之前的說法!

map看看呢!

.observeOn(Schedulers.io()) // 還可以指定一個io線程, 用map的形式進行預處理

.map(object: Function, List>{

override fun apply(t: List): List {

Log.e("observable map", "flatMap thread'name=" + Thread.currentThread().name)

return t

}

})

flatMap看看呢? -鏈表List我們可以做一些特殊,甚至是耗時處理!

.observeOn(Schedulers.io()) // 上一次請求的結果回調中,我們還是拿來在io線程中做預處理

.flatMap(object: Function, ObservableSource>>{

override fun apply(t: List): ObservableSource> {

// 這里是io線程,可以做一些耗時操作,然后返給onNext的UI線程

Log.e("observable", "flatMap thread'name=" + Thread.currentThread().name)

// 原樣的給返回去

return Observable.fromArray(t);

}

})

你要注意,這種線程指定與處理的成對出現!map/flatMap處理后,之后你可以切換到UI線程:

.observeOn(AndroidSchedulers.mainThread()) // 請求都完成后,切換到UI線程,將結果進行渲染

然后就可以進行subscribe的一個訂閱,此時請求啟動!這種邏輯小萌新要注解熟悉,當然可能重要的是看人家如何設計的,思想應該更重要一些!

從上面來看,我們此時應該就可以利用flatMap再次做請求了,(返回值是Observable)。 map是不行的啦,map不能返回ObservableSource!

直接上代碼如何:

GitHubService.kt

@GET("users/{user}/repos")

fun listReposStringRxJavaObservable(@Path("user") user: String): Observable>

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, ObservableSource>>{

override fun apply(t: List): ObservableSource> {

// 在進行一次請求 - 小萌新就將就重復調用了

// 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, ObservableSource>>{

override fun apply(t: List): ObservableSource> {

// 在進行一次請求 - 小萌新就將就重復調用了

// 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, ObservableSource>>{

override fun apply(t: List): ObservableSource> {

// 這里是io線程,可以做一些耗時操作,然后返給onNext的UI線程

Log.e("observable", "flatMap thread'name=" + Thread.currentThread().name)

// 原樣的給返回去

return Observable.fromArray(t);

}

})

.observeOn(AndroidSchedulers.mainThread()) // 請求都完成后,切換到UI線程,將結果進行渲染

.subscribe(object : Observer>{

override fun onComplete() {

}

override fun onSubscribe(d: Disposable) {

}

override fun onNext(t: List) {

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

不是搬磚,勝似搬磚! - 小萌新還是很努力的,就是努力的有點慢,努力的有點坑!

總結

以上是生活随笔為你收集整理的retrofit 会请求两次_Retrofit2+Rxjava-Rxjava2.x-篇二-依次执行多个请求-flatMap/map的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。