kotlin Rxjava3+retrofit2.0+RxLifecycle3封裝

在項目中一直都沒有怎麼用到過這是一大遺憾,只能在demo中使用了。

先給一個RxJAVA3的github 看看裏面使用方法,詳細就列出來了,可以看看裏面解釋:

Rxjava3

Rxlifecyc

Retrofit

這裏貼上版本信息:

Version 3.x (Javadoc)
single dependency: Reactive-Streams
Java 8+ (Android desugar friendly)
Java 8 lambda-friendly API
fixed API mistakes and many limits of RxJava 2
intended to be a replacement for RxJava 2 with relatively few binary incompatible changes
non-opinionated about the source of concurrency (threads, pools, event loops, fibers, actors, etc.)
async or synchronous execution
virtual time and schedulers for parameterized concurrency
test and diagnostic support via test schedulers, test consumers and plugin hooks
Learn more about RxJava in general on the Wiki Home.

Version 2.x
The 2.x version will be supported with bugfixes and important documentation updates until December 31, 2020. No new features will be added to 2.x.

Version 1.x
The 1.x version is end-of-life as of March 31, 2018. No further development, support, maintenance, PRs and updates will happen. The Javadoc of the very last version, 1.3.8, will remain accessible.

翻譯:

版本3.x(Javadoc)              
單一依賴項:反應流              
Java 8+(Android desugar友好型)             
Java 8 lambda友好型API              
修正了RxJava 2的API錯誤和許多限制              
打算用相對較少的二進制不兼容更改替換RxJava 2              
對競爭源(線程、池、事件循環、光纖、參與者等)不持任何意見              
異步或同步執行              
參數化競爭的虛擬時間與調度              
通過測試調度程序、測試消費者和插件掛鉤提供測試和診斷支持              
在Wiki主頁上了解有關RxJava的更多信息。       
       
版本2.x              
在2020年12月31日之前,2.x版本將支持錯誤修復和重要文檔更新。不會在2.x中添加新功能。 
            
版本1.x              
截至2018年3月31日,1.x版本已終止。不會進行進一步的開發、支持、維護、減貧戰略和更新。最新版本1.3.8的Javadoc將保持可訪問性。

2.0在今年完就不會更新了。

不囉嗦了,直接開始吧:

package com.lt.rxjavatext.net

import com.lt.rxjavatext.BuildConfig
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.logging.HttpLoggingInterceptor
import retrofit2.Retrofit
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory
import retrofit2.converter.gson.GsonConverterFactory
import java.util.concurrent.TimeUnit

class Api private constructor() {

    companion object {
        private const val BASE_URL = "https://www.wanandroid.com"
        const val USER_URL = "/project/tree/json"
        var retrofit: Retrofit? = null
        var request: ApiService? = null

        val mApi: Api by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) {
            Api()
        }
    }

    val log = HttpLoggingInterceptor()


    fun init() {
        log.level = if (BuildConfig.DEBUG) HttpLoggingInterceptor.Level.BASIC else HttpLoggingInterceptor.Level.NONE
        //初始化okhttp
        val client = OkHttpClient
            .Builder()
            .connectTimeout(30, TimeUnit.SECONDS)//連接超時設置
            .writeTimeout(30, TimeUnit.SECONDS)//寫入超時設置,
            .readTimeout(30, TimeUnit.SECONDS)//讀取超時設置
            .addInterceptor(log)
            .build()

        //初始化retrofit
        retrofit = Retrofit.Builder()
            .client(client)
            .baseUrl(BASE_URL)
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            .addConverterFactory(GsonConverterFactory.create())
            .build()
    }

    fun getRequest() {
        if (request == null) {
            synchronized(Request::class) {
                request = retrofit?.create(ApiService::class.java)
            }
        }
    }

}

上面的地址用到是鴻洋玩安卓裏面的api可以用。

仔細的看話就有疑問了,爲啥沒有用RXJava3 的包,其實已經試驗過,直接用Rxjava3是可以用的,但是因爲這個方法出問題

.addCallAdapterFactory(RxJava2CallAdapterFactory.create())

忘了把集成貼上了:

implementation "io.reactivex.rxjava3:rxjava:3.0.0-RC2"
    implementation 'com.squareup.retrofit2:retrofit:2.7.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.7.0'
    implementation 'io.reactivex:rxandroid:1.2.1'
    implementation 'com.squareup.okhttp3:logging-interceptor:3.13.1' //非必要依賴, log依賴,如果需要打印OkHttpLog需要添加
    implementation 'com.squareup.retrofit2:adapter-rxjava2:2.3.0' // 必要依賴,和Rxjava結合必須用到
    implementation 'com.trello.rxlifecycle3:rxlifecycle:3.1.0'
    implementation 'com.trello.rxlifecycle3:rxlifecycle-android-lifecycle-kotlin:3.1.0'
    implementation 'com.trello.rxlifecycle3:rxlifecycle-components:3.1.0'

rxjava3裏面包含的有rxjava2裏面的基本功能了。但是retrofit沒有更新到3,現在裏面基本都是android x包了,所有會報錯。

在建立一個retrofit2封裝的get/post請求 類 class

package com.lt.rxjavatext.net

import com.lt.rxjavatext.bean.UserBean
import com.lt.rxjavatext.bean.WanBean
import io.reactivex.Observable
import retrofit2.http.GET
import retrofit2.http.Url

interface ApiService {
    @GET
    fun listUsers(@Url url: String) : Observable<Response<UserBean>>

    @GET
    fun wanList(@Url url: String) : Observable<Response<List<WanBean>>>
}

裏面的UserBean是創建的類,根據需求創建,Response是個公共封裝類

package com.lt.rxjavatext.net



data class Response<T>(var errorCode: Int?, var data: T?, var errorMsg: String?)

裏面很簡單,根據後臺規則來

然後再定義一個獲取數據的基類:

package com.lt.rxjavatext.net

import android.util.Log
import io.reactivex.Observer
import io.reactivex.disposables.Disposable

abstract class BaseObserver<T> : Observer<Response<T>> {
    val TAG = "BaseObserber"

    override fun onSubscribe(d: Disposable) {
        Log.e(TAG, ",,,,,,,,,,,,," + d?.isDisposed)
    }

    override fun onNext(value: Response<T>) {
        if (value.errorCode  == 0) {
            onSuccess(value.data)
        } else {
            onFailure(null, value.errorMsg)
        }
    }


    override fun onError(error: Throwable) {
        Log.e(TAG, ",,,,,,,,,,,,," + error.message)
    }

    override fun onComplete() {
        Log.e(TAG, ",,,,,onComplete,,,,,,,,")
    }

    abstract fun onFailure(t: T?, message: String?)

    abstract fun onSuccess(data: T?)
}

這些都是很簡單的封裝,可以根據自己的需求添加更多的方法

這裏需要封裝一個調度器,不然很有的重複的代碼:

package com.lt.rxjavatext.net

import androidx.lifecycle.LifecycleOwner
import com.trello.rxlifecycle3.android.lifecycle.kotlin.bindToLifecycle
import io.reactivex.ObservableTransformer
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.schedulers.Schedulers
import java.util.concurrent.TimeUnit

object NetScheduler {


    fun <T> compose(lifecycleOwner: LifecycleOwner): ObservableTransformer<T, T> {

        return ObservableTransformer { observable ->
            observable
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .bindToLifecycle(lifecycleOwner)//綁定生命週期
                .debounce(1, TimeUnit.SECONDS)//防止1s內重複請求
        }
    }
}

其實挺遺憾的,除了這裏用到了RxLifecycle3,其他的好像沒有用到。後續會補上

別忘了初始化再appction裏面

class MyAppction :Application(){

    override fun onCreate() {
        super.onCreate()
        Api.mApi.init()
        Api.mApi.getRequest()

        
    }

}

調用方法

Api.request?.wanList(Api.USER_URL)
            ?.compose(NetScheduler.compose(this))
            ?.subscribe(object :BaseObserver<List<WanBean>>(){
                override fun onFailure(t: List<WanBean>?, message: String?) {

                }

                override fun onSuccess(data: List<WanBean>?) {
                    Log.e("msg","..............${data?.get(0)?.name}.....")
                }

            })

到這裏基本結束了

發佈了117 篇原創文章 · 獲贊 51 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章