电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

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

瀏覽:61日期:2022-09-23 08:40:33

現狀

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

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

把服務器地址放在接口Header中,然后通過攔截器來動態修改請求地址而實現的。除了默認服務器的接口,其它都要加一個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:多套服務類,實例化為多個對象,準確查找接口歸屬服務

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

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

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

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

動態更新服務地址

還可以動態更新服務地址,比如實現測試服務和正式服務間切換。

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

調用接口

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

可以根據需要調整為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>}

到此這篇關于詳解Android項目多服務端接口適配(超簡單)的文章就介紹到這了,更多相關Android多服務端接口適配 內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Android
相關文章:
主站蜘蛛池模板: 郑州巴特熔体泵有限公司专业的熔体泵,熔体齿轮泵与换网器生产厂家 | 电磁铁_小型推拉电磁铁_电磁阀厂家-深圳市宗泰电机有限公司 | 山西3A认证|太原AAA信用认证|投标AAA信用证书-山西AAA企业信用评级网 | 中央空调维修、中央空调保养、螺杆压缩机维修-苏州东菱空调 | 贵州科比特-防雷公司厂家提供贵州防雷工程,防雷检测,防雷接地,防雷设备价格,防雷产品报价服务-贵州防雷检测公司 | 河南mpp电力管_mpp电力管生产厂家_mpp电力电缆保护管价格 - 河南晨翀实业 | 淘气堡_室内儿童乐园_户外无动力儿童游乐设备-高乐迪(北京) | 智慧水务|智慧供排水利信息化|水厂软硬件系统-上海敢创 | 淄博不锈钢,淄博不锈钢管,淄博不锈钢板-山东振远合金科技有限公司 | 渣土车电机,太阳能跟踪器电机,蜗轮蜗杆减速电机厂家-淄博传强电机 | 聚氨酯催化剂K15,延迟催化剂SA-1,叔胺延迟催化剂,DBU,二甲基哌嗪,催化剂TMR-2,-聚氨酯催化剂生产厂家 | 对夹式止回阀厂家,温州对夹式止回阀制造商--永嘉县润丰阀门有限公司 | 泥浆在线密度计厂家-防爆数字压力表-膜盒-远传压力表厂家-江苏大亚自控设备有限公司 | 电磁流量计厂家_涡街流量计厂家_热式气体流量计-青天伟业仪器仪表有限公司 | 阜阳在线-阜阳综合门户| 郑州水质检测中心_井水检测_河南废气检测_河南中环嘉创检测 | 上海软件开发-上海软件公司-软件外包-企业软件定制开发公司-咏熠科技 | 综合管廊模具_生态,阶梯护坡模具_检查井模具制造-致宏模具厂家 | 长城人品牌官网 | 影合社-影视人的内容合作平台 | 防爆正压柜厂家_防爆配电箱_防爆控制箱_防爆空调_-盛通防爆 | 无线联网门锁|校园联网门锁|学校智能门锁|公租房智能门锁|保障房管理系统-KEENZY中科易安 | 物和码官网,物和码,免费一物一码数字化营销SaaS平台 | 亚洲工业智能制造领域专业门户网站 - 亚洲自动化与机器人网 | 谷歌关键词优化-外贸网站优化-Google SEO小语种推广-思亿欧外贸快车 | 工作服定制,工作服定做,工作服厂家-卡珀职业服装(苏州)有限公司 | 润滑油加盟_润滑油厂家_润滑油品牌-深圳市沃丹润滑科技有限公司 琉璃瓦-琉璃瓦厂家-安徽盛阳新型建材科技有限公司 | 电销卡_北京电销卡_包月电话卡-豪付网络 | 科昊仪器超纯水机系统-可成气相液氮罐-美菱超低温冰箱-西安昊兴生物科技有限公司 | 农业仪器网 - 中国自动化农业仪器信息交流平台 | 扫地车厂家-山西洗地机-太原电动扫地车「大同朔州吕梁晋中忻州长治晋城洗地机」山西锦力环保科技有限公司 | 上海心叶港澳台联考一对一培训_上海心叶港澳台联考,港澳台联考一对一升学指导 | 机制砂选粉机_砂石选粉机厂家-盐城市助成粉磨科技有限公司 | 皮带式输送机械|链板式输送机|不锈钢输送机|网带输送机械设备——青岛鸿儒机械有限公司 | 密集架-密集柜厂家-智能档案密集架-自动选层柜订做-河北风顺金属制品有限公司 | 合肥网络推广_合肥SEO网站优化-安徽沃龙First | 东风体检车厂家_公共卫生体检车_医院体检车_移动体检车-锦沅科贸 | 水冷散热器_水冷电子散热器_大功率散热器_水冷板散热器厂家-河源市恒光辉散热器有限公司 | PE拉伸缠绕膜,拉伸缠绕膜厂家,纳米缠绕膜-山东凯祥包装 | 消泡剂-水处理消泡剂-涂料消泡剂-切削液消泡剂价格-东莞德丰消泡剂厂家 | 武汉高温老化房,恒温恒湿试验箱,冷热冲击试验箱-武汉安德信检测设备有限公司 |