Android網絡請求--Retrofit2使用方法
歡迎Follow我的 GitHub , 關注我的CSDN.
Retrofit 是Square開發的網絡請求庫, 簡化了網絡請求的使用, 這個庫太知名了, 好處我就不多說了. 讓我們看看如何使用吧?
注意: Retrofit2的beta3版本, 使用Okhttp3, Interceptor使用方式發生改變.
主要
(1) Retrofit2( beta3 )的請求方式.
(2) Okhttp3的Interceptor.
(3) Okhttp3的Deserializer.
(4) Retrofit2使用 Gson轉換器(Converter) 和 RxJava適配器(Adapter) .
Github 下載地址
1. 基本請求
使用接口, 區分 Get 和 Post 方法.
/* 網絡請求 <p> Created by wangchenlong on 16/1/21. */
public interface MarvelService {
String END_POINT = "
@GET("/v1/public/characters")
Observable<List<AvengersCharacter>> getCharacters(@Query("offset") int offset);
}</pre>
使用Retrofit類創建接口服務, 指定Gson為轉換器, 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();
// 服務
mMarvelService = marvelApiAdapter.create(MarvelService.class);
}
// 返回人物信息
@Override
public Observable<List<AvengersCharacter>> getCharacters(int currentOffset) {
return mMarvelService.getCharacters(currentOffset);
}
}</pre>
2. Interceptor
Interceptor是攔截器, 在發送之前, 添加一些參數, 或者獲取一些信息.如MarvelSigningInterceptor是添加參數, loggingInterceptor是打印參數.
/* 添加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();
// 添加新的參數
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);
}
}</pre>
addQueryParameter添加網絡參數.
</div>
Okhttp3使用了裝飾者模式, 使用Builder添加Interceptor.
// OkHttp3.0的使用方式
OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(signingInterceptor)
.addInterceptor(loggingInterceptor)
.build();
3. Deserializer
Deserializer是反序列化, Gson使用, 去除不使用的參數.
public class MarvelResultsDeserializer<T> implements JsonDeserializer<List<T>> {
@Override
public List<T> deserialize(JsonElement je, Type typeOfT,
JsonDeserializationContext context) throws JsonParseException {
// 轉換Json的數據, 獲取內部有用的信息
JsonElement results = je.getAsJsonObject().get("data")
.getAsJsonObject().get("results");
return new Gson().fromJson(results, typeOfT);
}
}
Gson使用Deserializer, 過濾不用的參數.
// 選擇人物信息
Gson customGsonInstance = new GsonBuilder()
.registerTypeAdapter(new TypeToken<List<AvengersCharacter>>() {
}.getType(),
new MarvelResultsDeserializer<AvengersCharacter>())
.create();
4. 獲取數據
Rx選擇執行線程和返回線程.
private void loadData() {
mCharactersSubscription = mRepository.getCharacters(0)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(avengersCharacters -> {
mMainView.setListData(avengersCharacters);
});
}
Rxjava + Dagger + Retrofit , 三個編程庫, 都已經寫完了, 基本都是在一起使用. 文章里面都含有獨立Demo, 大家可以配合使用, 感謝Square給我們帶來, 的優雅代碼.
OK, that’s all! Enjoy it.
來自: http://blog.csdn.net/caroline_wendy/article/details/50557470