MarvelNetwork
如何使用
app gradle 中添加以下代碼
apply plugin: 'com.android.application'
android {
// 略...
}
repositories {
maven { url "https://github.com/ywqln/marvel-network/raw/master" }
}
dependencies {
// 略...
implementation 'com.marvel:network:1.0.1'
}
認(rèn)識 marvel network
項(xiàng)目中難免會有多方接口,那就意味著多種baseUrl,多種Header,多種數(shù)據(jù)結(jié)構(gòu)。而我們在使用過程中對Retrofit切換baseUrl,Header頻繁起來,會覺得不那么舒服,所以這方面需要設(shè)計(jì)下
marvel network使用注解的方式來描述接口的interface聲明文件,統(tǒng)一來管理一個interface下的所有接口都使用同一個baseUrl,同一個Header。
在項(xiàng)目中,baseUrl也可能是從一個接口中獲取到的,注解上要求字符串的值是常量,考慮到這種情況,marvel network提供了動態(tài)的baseUrl設(shè)置,設(shè)置方式如下:
@BaseUrl(dynamic = NewsBaseUrlInterceptor.class)
public interface NewsApi {
// 略...
}
NewsBaseUrlInterceptor文件,NewsBaseUrlInterceptor
必須是一個實(shí)現(xiàn)BaseUrlInterceptor接口的類,并實(shí)現(xiàn)void getBaseUrl()
方法
public class NewsBaseUrlInterceptor implements BaseUrlInterceptor {
@Override
public String getBaseUrl() {
return "http://toutiao-ali.juheapi.com";
}
}
如果你想直接設(shè)置baseUrl,不需要動態(tài),可以按以下方式設(shè)置:
@BaseUrl("http://toutiao-ali.juheapi.com")
public interface NewsApi {
// 略...
}
默認(rèn)提供的一些工具
-
ApiThreadTransformer
線程切換,在io線程發(fā)起請求,在main線程處理數(shù)據(jù)。 -
ResponseObserver
繼承Observer
后重寫了onError,對錯誤做了重新定義,通過網(wǎng)絡(luò)狀態(tài)碼來轉(zhuǎn)為中文消息,且不吞沒狀態(tài)碼。對于成功響應(yīng)定義為數(shù)據(jù)返回且業(yè)務(wù)處理正常,失敗定義為網(wǎng)絡(luò)層出錯或服務(wù)器處理出錯。 -
SimpleObserver
繼承自ResponseObserver
,但無需實(shí)現(xiàn)onSubscribe
和onComplete
。當(dāng)無需在發(fā)起請求和完成請求時處理的時候,可選擇。
如何定義一個api
@BaseUrl
用在整個interface,表示但凡是在整個interface中聲明的接口,他們的baseUrl都是一樣的。同理,@Interceptors
也是一樣。
/**
* 描述:新聞相關(guān)接口.
* <p>
*
* @author yanwenqiang.
* @date 2019/1/21
*/
@BaseUrl(value = "http://toutiao-ali.juheapi.com")
@Interceptors(NewsHeaderInterceptor.class)
public interface NewsApi {
/**
* 獲取新聞列表
*
* @param type 可選參數(shù):top(頭條,默認(rèn)),shehui(社會),guonei(國內(nèi)),guoji(國際),yule(娛樂),
* tiyu(體育)junshi(軍事),keji(科技),caijing(財(cái)經(jīng)),shishang(時尚)
*/
@GET("/toutiao/index")
Observable<NewsResp<NewsResult>> getNews(@Query("type") String type);
}
如何發(fā)起網(wǎng)絡(luò)請求
Requestor.instance()
.getApi(NewsApi.class)
.getNews("yule")
.compose(new ApiThreadTransformer<>())
.compose(new NewsTransformer<>())
.subscribe(new ResponseObserver<NewsResult>() {
@Override
protected void onSuccess(NewsResult result) {
NetLog.json(new Gson().toJson(result.getData()));
}
@Override
protected void onFail(ResponseException responseException) {
NetLog.e(responseException.message);
}
@Override
public void onSubscribe(Disposable d) {
NetLog.p("開始發(fā)送請求...");
}
@Override
public void onComplete() {
NetLog.p("請求處理完成...");
}
});