本文的合集已經(jīng)編著成書月弛,高級Android開發(fā)強化實戰(zhàn)列林,歡迎各位讀友的建議和指導(dǎo)惋嚎。在京東即可購買:https://item.jd.com/12385680.html
Retrofit是Square開發(fā)的網(wǎng)絡(luò)請求庫, 簡化了網(wǎng)絡(luò)請求的使用, 這個庫太知名了, 好處我就不多說了. 讓我們看看如何使用吧?
注意: Retrofit2的beta3版本, 使用Okhttp3, Interceptor使用方式發(fā)生改變.
主要
(1) Retrofit2(beta3)的請求方式.
(2) Okhttp3的Interceptor.
(3) Okhttp3的Deserializer.
(4) Retrofit2使用Gson轉(zhuǎn)換器(Converter)和RxJava適配器(Adapter).
1. 基本請求
使用接口, 區(qū)分Get和Post方法.
/**
* 網(wǎng)絡(luò)請求
* <p>
* Created by wangchenlong on 16/1/21.
*/
public interface MarvelService {
String END_POINT = "http://gateway.marvel.com/";
String PARAM_API_KEY = "apikey";
String PARAM_HASH = "hash";
String PARAM_TIMESTAMP = "ts";
@GET("/v1/public/characters")
Observable<List<AvengersCharacter>> getCharacters(@Query("offset") int offset);
}
使用Retrofit類創(chuàng)建接口服務(wù), 指定Gson為轉(zhuǎn)換器, RxJava為適配器.
public class RestDataSource implements Repository {
private final MarvelService mMarvelService;
@Inject
public RestDataSource() {
// Log信息
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BASIC);
// 公私密匙
MarvelSigningInterceptor signingInterceptor = new MarvelSigningInterceptor(
BuildConfig.MARVEL_PUBLIC_KEY, BuildConfig.MARVEL_PRIVATE_KEY);
// OkHttp3.0的使用方式
OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(signingInterceptor)
.addInterceptor(loggingInterceptor)
.build();
// 選擇人物信息
Gson customGsonInstance = new GsonBuilder()
.registerTypeAdapter(new TypeToken<List<AvengersCharacter>>() {
}.getType(),
new MarvelResultsDeserializer<AvengersCharacter>())
.create();
// 適配器
Retrofit marvelApiAdapter = new Retrofit.Builder()
.baseUrl(MarvelService.END_POINT)
.addConverterFactory(GsonConverterFactory.create(customGsonInstance))
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.client(client)
.build();
// 服務(wù)
mMarvelService = marvelApiAdapter.create(MarvelService.class);
}
// 返回人物信息
@Override
public Observable<List<AvengersCharacter>> getCharacters(int currentOffset) {
return mMarvelService.getCharacters(currentOffset);
}
}
2. Interceptor
Interceptor是攔截器, 在發(fā)送之前, 添加一些參數(shù), 或者獲取一些信息.
如MarvelSigningInterceptor是添加參數(shù), loggingInterceptor是打印參數(shù).
/**
* 添加Key和密碼
* <p>
* Created by wangchenlong on 16/1/21.
*/
public class MarvelSigningInterceptor implements Interceptor {
private final String mApiKey;
private final String mApiSecret;
public MarvelSigningInterceptor(String apiKey, String apiSecret) {
mApiKey = apiKey;
mApiSecret = apiSecret;
}
@Override public Response intercept(Interceptor.Chain chain) throws IOException {
String marvelHash = MarvelApiUtils.generateMarvelHash(mApiKey, mApiSecret);
Request oldRequest = chain.request();
// 添加新的參數(shù)
HttpUrl.Builder authorizedUrlBuilder = oldRequest.url()
.newBuilder()
.scheme(oldRequest.url().scheme())
.host(oldRequest.url().host())
.addQueryParameter(MarvelService.PARAM_API_KEY, mApiKey)
.addQueryParameter(MarvelService.PARAM_TIMESTAMP, MarvelApiUtils.getUnixTimeStamp())
.addQueryParameter(MarvelService.PARAM_HASH, marvelHash);
// 新的請求
Request newRequest = oldRequest.newBuilder()
.method(oldRequest.method(), oldRequest.body())
.url(authorizedUrlBuilder.build())
.build();
return chain.proceed(newRequest);
}
}
addQueryParameter添加網(wǎng)絡(luò)參數(shù).
Okhttp3使用了裝飾者模式, 使用Builder添加Interceptor.
// OkHttp3.0的使用方式
OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(signingInterceptor)
.addInterceptor(loggingInterceptor)
.build();
3. Deserializer
Deserializer是反序列化, Gson使用, 去除不使用的參數(shù).
public class MarvelResultsDeserializer<T> implements JsonDeserializer<List<T>> {
@Override
public List<T> deserialize(JsonElement je, Type typeOfT,
JsonDeserializationContext context) throws JsonParseException {
// 轉(zhuǎn)換Json的數(shù)據(jù), 獲取內(nèi)部有用的信息
JsonElement results = je.getAsJsonObject().get("data")
.getAsJsonObject().get("results");
return new Gson().fromJson(results, typeOfT);
}
}
Gson使用Deserializer, 過濾不用的參數(shù).
// 選擇人物信息
Gson customGsonInstance = new GsonBuilder()
.registerTypeAdapter(new TypeToken<List<AvengersCharacter>>() {
}.getType(),
new MarvelResultsDeserializer<AvengersCharacter>())
.create();
4. 獲取數(shù)據(jù)
Rx選擇執(zhí)行線程和返回線程.
private void loadData() {
mCharactersSubscription = mRepository.getCharacters(0)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(avengersCharacters -> {
mMainView.setListData(avengersCharacters);
});
}
Rxjava+Dagger+Retrofit, 三個編程庫, 都已經(jīng)寫完了, 基本都是在一起使用. 文章里面都含有獨立Demo, 大家可以配合使用, 感謝Square給我們帶來, 的優(yōu)雅代碼.
OK, that's all! Enjoy it.