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