最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Android項目多服務端接口適配(超簡單)

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

現(xiàn)狀

Android項目如果是多服務端接口時,一般怎么弄呢?

方法1:服務器地址放在Header中

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

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:多套服務類,實例化為多個對象,準確查找接口歸屬服務

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

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:全寫在一起,實例化為多個對象,準確調(diào)用方法

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

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
}

有更簡單的方法嗎?

當然有了,而且超方便!

定義接口

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

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>
  }

建工具類

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

可以重寫invokeApi方法,全局給每個Observable設定線程。

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())
  }
}

動態(tài)更新服務地址

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

//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
}

該項目使用的三方庫

  • 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

可以給每套服務設置不同的超時

@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項目多服務端接口適配(超簡單)的文章就介紹到這了,更多相關(guān)Android多服務端接口適配 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Android開發(fā)中Flutter組件實用技巧

    Android開發(fā)中Flutter組件實用技巧

    這篇文章主要為大家介紹了Android開發(fā)中Flutter組件實用技巧,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • Android 調(diào)用發(fā)送短信的方法

    Android 調(diào)用發(fā)送短信的方法

    這篇文章主要介紹了Android 調(diào)用發(fā)送短信的方法的相關(guān)資料,主要實現(xiàn)Android 調(diào)用短信的使用,希望通過本文能幫助到大家,需要的朋友可以參考下
    2017-09-09
  • Kotlin實用語法糖空安全類型轉(zhuǎn)換及相等性判斷

    Kotlin實用語法糖空安全類型轉(zhuǎn)換及相等性判斷

    這篇文章主要為大家介紹了Kotlin實用語法糖空安全類型轉(zhuǎn)換及相等性判斷示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • Android中Dialog自定義上下文花式菜單

    Android中Dialog自定義上下文花式菜單

    這篇文章主要為大家詳細介紹了Android中Dialog自定義上下文花式菜單,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • Android TextView Marquee的應用實例詳解

    Android TextView Marquee的應用實例詳解

    這篇文章主要介紹了Android TextView Marquee的應用實例詳解的相關(guān)資料,這里說明使用方法及簡單實例和注意實現(xiàn),需要的朋友可以參考下
    2017-08-08
  • Flutter調(diào)用Android和iOS原生代碼的方法示例

    Flutter調(diào)用Android和iOS原生代碼的方法示例

    這篇文章主要給大家介紹了關(guān)于Flutter調(diào)用Android和iOS原生代碼的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Flutter具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-04-04
  • Android setTag方法的key問題解決辦法

    Android setTag方法的key問題解決辦法

    這篇文章主要介紹了Android setTag方法的key問題解決辦法的相關(guān)資料,需要的朋友可以參考下
    2016-09-09
  • Android語音識別技術(shù)詳解及實例代碼

    Android語音識別技術(shù)詳解及實例代碼

    這篇文章主要介紹了Android語音識別技術(shù)的相關(guān)資料,并附實例代碼及實例實現(xiàn)效果圖,需要的朋友可以參考下
    2016-09-09
  • Android實現(xiàn)美團外賣底部導航欄動畫

    Android實現(xiàn)美團外賣底部導航欄動畫

    這篇文章主要介紹了Android實現(xiàn)美團外賣底部導航欄動畫,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • ActivityManagerService廣播注冊與發(fā)送示例解析

    ActivityManagerService廣播注冊與發(fā)送示例解析

    這篇文章主要為大家介紹了ActivityManagerService廣播注冊與發(fā)送示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03

最新評論

金沙县| 安陆市| 蒙山县| 吴江市| 武威市| 荥阳市| 阿瓦提县| 金川县| 文山县| 虹口区| 武义县| 英超| 方正县| 承德市| 五原县| 龙泉市| 陆河县| 盘山县| 金华市| 喀喇沁旗| 乐东| 新营市| 东乡族自治县| 南通市| 乌兰浩特市| 花莲市| 巴塘县| 榆中县| 延安市| 宜丰县| 临邑县| 涞源县| 瑞丽市| 双流县| 上蔡县| 调兵山市| 石嘴山市| 沅江市| 固安县| 衡阳市| 天水市|