retrofit2兼容rxjava的配置和demo



廢話不多說,直接貼上代碼,代碼中完全的註釋,完整的demo在最下面
package com.example.administrator.myapplication000.http;

import java.io.IOException;
import java.lang.reflect.Field;
import java.util.concurrent.TimeUnit;

import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Callback;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;

/**
 * Created by l on 2016-10-15.
 */
public class Retrofit2Manger {
    static Retrofit2Manger retrofit2Manger;

    private Retrofit2Manger() {

    }

    public static synchronized Retrofit2Manger getInstance() {
        if (retrofit2Manger == null) {
            retrofit2Manger = new Retrofit2Manger();
        }
        return retrofit2Manger;
    }

//將retrofit的配置好,並且反射出對象以便實用
    public <T> T create(Class<T> service) {
        Retrofit retrofit = new Retrofit.Builder()
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())//兼容rxjava,網絡請求可以直接返回一個Obervable或者call
                .addConverterFactory(GsonConverterFactory.create())//兼容gson,網絡請求成功,直接返回一個轉換好的對象出來
                .client(getOkHttpClient())//配置ohhttp
                .baseUrl(getBaseUrl(service))//獲取url
                .build();
        return retrofit.create(service);
    }

    private final int Time_Out = 10;

    private OkHttpClient getOkHttpClient() {
        OkHttpClient.Builder builder = new OkHttpClient.Builder();
        builder.connectTimeout(Time_Out, TimeUnit.SECONDS);
        builder.readTimeout(Time_Out, TimeUnit.SECONDS);
        builder.writeTimeout(Time_Out, TimeUnit.SECONDS);
        //配置打印信息,網絡響應體中的數據都會打印出來
        HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
        loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
        builder.addInterceptor(loggingInterceptor);
        builder.addInterceptor(new HttpInterceptor());
        return builder.build();
    }

    //所有的頭部信息都可以在這裏添加到頭部中去
    public class HttpInterceptor implements Interceptor {
        @Override
        public Response intercept(Chain chain) throws IOException {
            Request.Builder builder = chain.request().newBuilder();
            Request requst = builder.addHeader("Content-type", "application/json").build();
//所有公用頭部信息,都要從這裏add進去
            return chain.proceed(requst);
        }
    }


    //簡單的反射,將url反射出來
    private <T> String getBaseUrl(Class<T> service) {
        try {
            Field base_url = service.getField("Base_Url");
            return (String) base_url.get(service);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }


}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章