欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Android項(xiàng)目多服務(wù)端接口適配(超簡單)

 更新時(shí)間:2020年08月10日 08:29:35   作者:DonaldDu  
這篇文章主要介紹了Android項(xiàng)目多服務(wù)端接口適配(超簡單),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

現(xiàn)狀

Android項(xiàng)目如果是多服務(wù)端接口時(shí),一般怎么弄呢?

方法1:服務(wù)器地址放在Header中

把服務(wù)器地址放在接口Header中,然后通過攔截器來動(dòng)態(tài)修改請(qǐng)求地址而實(shí)現(xiàn)的。除了默認(rèn)服務(wù)器的接口,其它都要加一個(gè)Header,有點(diǎn)麻煩??雌饋硪膊凰?,不簡潔。

interface ApiHeaderCase {
  /************************** server A ****************************/
  @Headers("host:$SERVER_HOST_A")
  @GET("user/loginWithScanCode")
  fun aMethod1(@Query("id") id: Int): Observable<ResponseBody>

  /************************** server B ****************************/
  @Headers("host:$SERVER_HOST_B")
  @GET("user/loginWithScanCode")
  fun bMethod1(@Query("id") id: Int): Observable<ResponseBody>
}

方法2:多套服務(wù)類,實(shí)例化為多個(gè)對(duì)象,準(zhǔn)確查找接口歸屬服務(wù)

定義多個(gè)類,每個(gè)類定義一套服務(wù)接口。然后分別實(shí)例化為多個(gè)對(duì)象,再使用準(zhǔn)確的對(duì)象來調(diào)用接口。這種方法運(yùn)行效率是最高的,但是在開發(fā)時(shí),可能無法快速知道接口歸屬與哪個(gè)服務(wù),需要查看代碼才能準(zhǔn)確知曉,可以說是少了代碼提示能力。

interface ApiA {
  @GET("user/loginWithScanCode")
  fun methodA(@Query("id") id: Int): Observable<ResponseBody>
}

interface ApiB {
  @GET("user/loginWithScanCode")
  fun methodB(@Query("id") id: Int): Observable<ResponseBody>
}

方法3:全寫在一起,實(shí)例化為多個(gè)對(duì)象,準(zhǔn)確調(diào)用方法

把所有接口都寫在一個(gè)類中,然后根據(jù)服務(wù)地址分別實(shí)例化為多個(gè)對(duì)象。再準(zhǔn)確調(diào)用方法,為了保證準(zhǔn)確調(diào)用方法,可以給每個(gè)接口加個(gè)服務(wù)名的前綴,以減少方法調(diào)錯(cuò)的問題。

interface ApiAllInOne {
  /************************** server A ****************************/
  @GET("user/loginWithScanCode")
  fun aMethod1(@Query("id") id: Int): Observable<ResponseBody>

  /************************** server B ****************************/
  @GET("user/loginWithScanCode")
  fun bMethod1(@Query("id") id: Int): Observable<ResponseBody>
}

const val SERVER_HOST_A = "https://www.a.com/"
const val SERVER_HOST_B = "https://www.b.com/"
fun getApi(retrofit: Retrofit, host: String): ApiAllInOne {
  return retrofit.newBuilder()
      .baseUrl(host).build()
      .create(ApiAllInOne::class.java)
}

fun showNomalUseCase(retrofit: Retrofit) {
  val apiA = getApi(retrofit, SERVER_HOST_A)//save as single instance for repeated usage
  apiA.aMethod1(1).subscribe()
  apiA.bMethod1(1).subscribe()//invalid usage, but no compile error

  val apiB = getApi(retrofit, SERVER_HOST_B)
  apiB.bMethod1(1).subscribe()
  apiB.aMethod1(1).subscribe()//invalid usage, but no compile error
}

有更簡單的方法嗎?

當(dāng)然有了,而且超方便!

定義接口

(建議)在一個(gè)KT文件中定義所有接口,方便查找和維護(hù)。

interface ApiHolder : ApiA, ApiB

  @BaseUrl("https://www.a.com/")
  interface ApiA {
    @GET("user/loginWithScanCode")
    fun methodA(@Query("id") id: Int): Observable<ResponseBody>
  }

  @BaseUrl("https://www.b.com/")
  interface ApiB {
    @GET("user/loginWithScanCode")
    fun methodB(@Query("id") id: Int): Observable<ResponseBody>
  }

建工具類

一般都需要個(gè)工具類的,方便配置攔截器等。如果沒有自定義的需求,也可以直接實(shí)例化來用。

可以重寫invokeApi方法,全局給每個(gè)Observable設(shè)定線程。

class ApiUtil : ApiHolderUtil<ApiHolder>(ApiHolder::class) {
  companion object {
    val apiUtil = ApiUtil()
    val api = apiUtil.api
  }

  override fun invokeApi(api: Any, method: Method, args: Array<*>?): Any {
    val observable = super.invokeApi(api, method, args) as Observable<*>
    return observable.subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
  }
}

動(dòng)態(tài)更新服務(wù)地址

還可以動(dòng)態(tài)更新服務(wù)地址,比如實(shí)現(xiàn)測試服務(wù)和正式服務(wù)間切換。

//update api baseUrl when needed
  apiUtil.updateApi(ApiA::class, https://www.a2.com/)

調(diào)用接口

api.methodA(1).subscribe()
  api.methodB(1).subscribe()

引入依賴

dependencies {
  implementation 'com.github.DonaldDu:ApiHolder:x.x.x'//JitPack version
}

該項(xiàng)目使用的三方庫

  • OkHttp3
  • Retrofit2
  • rxjava3(可以修改為rxjava2)
api 'com.squareup.okhttp3:okhttp:4.7.2'
  api "com.squareup.retrofit2:retrofit:2.9.0"
  api "com.squareup.retrofit2:converter-gson:2.9.0"
  api "com.squareup.retrofit2:adapter-rxjava3:2.9.0"
  api 'io.reactivex.rxjava3:rxandroid:3.0.0'

其它說明

rxjava3 ->rxjava2

可以根據(jù)需要調(diào)整為rxjava2,建議用最新的。

//重寫ApiHolderUtil如下方法,RxJava3CallAdapterFactory ->RxJava2CallAdapterFactory即可。
  protected open fun getRetrofit(client: OkHttpClient): Retrofit {
    return Retrofit.Builder()
        .validateEagerly(validateEagerly)
        .addConverterFactory(getGsonConverterFactory())
        .addCallAdapterFactory(RxJava3CallAdapterFactory.create())
        .baseUrl("http://www.demo.com/")
        .client(client)
        .build()
  }

Timeout

可以給每套服務(wù)設(shè)置不同的超時(shí)

@BaseUrl("https://www.b.com/")
@Timeout(read = 100, timeUnit = TimeUnit.SECONDS)
interface ApiB {
  @GET("user/loginWithScanCode")
  fun methodB(@Query("id") id: Int): Observable<ResponseBody>
}

到此這篇關(guān)于詳解Android項(xiàng)目多服務(wù)端接口適配(超簡單)的文章就介紹到這了,更多相關(guān)Android多服務(wù)端接口適配 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Android VideoView類實(shí)例講解

    Android VideoView類實(shí)例講解

    本文主要介紹Android VideoView類,這里對(duì)VideoView類詳細(xì)說明了使用方法,以及示例代碼,有興趣的朋友可以參考下,希望能幫助Android 開發(fā)的朋友
    2016-08-08
  • Android使用SoundPool播放音效實(shí)例

    Android使用SoundPool播放音效實(shí)例

    這篇文章主要為大家詳細(xì)介紹了Android使用SoundPool播放音效,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • Android 優(yōu)化之卡頓優(yōu)化的實(shí)現(xiàn)

    Android 優(yōu)化之卡頓優(yōu)化的實(shí)現(xiàn)

    這篇文章主要介紹了Android 優(yōu)化之卡頓優(yōu)化的實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-07-07
  • Flutter 實(shí)現(xiàn)網(wǎng)易云音樂字幕的代碼

    Flutter 實(shí)現(xiàn)網(wǎng)易云音樂字幕的代碼

    這篇文章主要介紹了Flutter 實(shí)現(xiàn)網(wǎng)易云音樂字幕的代碼,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-04-04
  • Android開發(fā)系列二之窗口Activity的生命周期

    Android開發(fā)系列二之窗口Activity的生命周期

    這篇文章主要介紹了Android學(xué)習(xí)系列二之窗口Activity的生命周期的相關(guān)資料,需要的朋友可以參考下
    2016-05-05
  • Android學(xué)習(xí)之介紹Binder的簡單使用

    Android學(xué)習(xí)之介紹Binder的簡單使用

    BInder方面的資料雖然感覺看的比較多,但是真正用的時(shí)候才發(fā)現(xiàn)有很多地方模棱兩棵的,所以,打算用一個(gè)實(shí)例再來鞏固一下binder的使用方法。這篇文章主要介紹了Android中Binder的簡單使用,文中給出詳細(xì)的示例代碼,需要的朋友可以參考下
    2016-12-12
  • Android實(shí)現(xiàn)bitmap指定區(qū)域滑動(dòng)截取功能

    Android實(shí)現(xiàn)bitmap指定區(qū)域滑動(dòng)截取功能

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)bitmap指定區(qū)域滑動(dòng)截取功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • Android中一個(gè)應(yīng)用實(shí)現(xiàn)多個(gè)圖標(biāo)的幾種方式

    Android中一個(gè)應(yīng)用實(shí)現(xiàn)多個(gè)圖標(biāo)的幾種方式

    這篇文章主要給大家介紹了在Android中一個(gè)應(yīng)用如何實(shí)現(xiàn)多個(gè)圖標(biāo)的幾種方式,其中包括了多Activity + intent-filter方式、activity-alias方式以及網(wǎng)頁標(biāo)簽-添加快捷方式,分別給出了詳細(xì)的示例代碼,需要的朋友可以參考借鑒。
    2017-05-05
  • Android使用AudioRecord實(shí)現(xiàn)錄音功能

    Android使用AudioRecord實(shí)現(xiàn)錄音功能

    這篇文章主要為大家詳細(xì)介紹了Android使用AudioRecord實(shí)現(xiàn)錄音功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • Android通過SOCKET下載文件的方法

    Android通過SOCKET下載文件的方法

    這篇文章主要介紹了Android通過SOCKET下載文件的方法,實(shí)例分析了Android使用Socket進(jìn)行文件傳輸?shù)募记?需要的朋友可以參考下
    2015-12-12

最新評(píng)論