• 直接上代码 ,一个RetrofitFactory,一个ApiFactory

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    package com.aidebar.retrofitutils.Utils.RetrofitUtils;

    import okhttp3.OkHttpClient;
    import retrofit2.Retrofit;
    import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
    import retrofit2.converter.gson.GsonConverterFactory;

    /**
    * @author xzj
    * @date 2016/8/25 09:37.
    * 用于获取配置好的retrofit对象
    * 需要先调用setBaseUrl,如果项目中BaseUrl不变,可以写死
    */
    public class RetrofitFactory {
    private static Retrofit retrofit;
    private static String baseUrl;

    public static void setBaseUrl(String url) {
    baseUrl = url;
    }

    /**
    * 获取配置好的retrofit对象来生产Manager对象
    */
    public static Retrofit getRetrofit() {
    if (retrofit == null) {
    if (baseUrl == null || baseUrl.length() <= 0)
    throw new IllegalStateException("请在调用getFactory之前先调用setBaseUrl");

    Retrofit.Builder builder = new Retrofit.Builder();
    builder.baseUrl(baseUrl)
    .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) // 参考RxJava
    .addConverterFactory(GsonConverterFactory.create()); // 参考与GSON的结合

    // 参考自定义Log输出
    OkHttpClient client = new OkHttpClient().newBuilder()
    // .addInterceptor(new Interceptor() { //这个拦截器是操作请求头的
    // @Override
    // public Response intercept(Chain chain) throws IOException {
    // Request request = chain.request().newBuilder()
    // .addHeader("version", "123411") //这里就是添加一个请求头
    // .build();
    //
    //// Buffer buffer = new Buffer(); 不依赖下面的Interceptor,用这三行也能打印出请求体
    //// request.body().writeTo(buffer);
    //// Log.d(getClass().getSimpleName(), "intercept: " + buffer.readUtf8());
    //
    // return chain.proceed(request);
    // }
    // })
    // .addInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY)) //这个拦截器是用来打印日志的,不稳定
    .build();
    builder.client(client);
    retrofit = builder.build();
    }
    return retrofit;
    }
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    package com.aidebar.retrofitutils.Utils.RetrofitUtils;

    import java.util.HashMap;

    /**
    * @author xzj
    * @date 2016/8/25 09:38.
    * 通过定义好的api接口以及Retrofit来生成具体的实例.
    */
    public class ApiFactory {
    private static ApiFactory factory;
    private static HashMap<String, Object> serviceMap = new HashMap<>();

    public static ApiFactory getFactory() {
    if (factory == null) {
    synchronized (ApiFactory.class) {
    if (factory == null)
    factory = new ApiFactory();
    }
    }
    return factory;
    }

    public <T> T create(Class<T> clz) {
    Object service = serviceMap.get(clz.getName());
    if (service == null) {
    service = RetrofitFactory.getRetrofit().create(clz);
    serviceMap.put(clz.getName(), service);
    }
    return (T) service;
    }
    }

    还有2个是用rxjava进行配合的可以选用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
package com.aidebar.retrofitutils.Utils.RetrofitUtils;
import android.content.Context;
import android.widget.Toast;

import com.aidebar.retrofitutils.R;
import com.aidebar.retrofitutils.Utils.RetrofitUtils.JsonBean.BaseJsonBean;

import java.net.ConnectException;
import java.net.SocketTimeoutException;

import retrofit2.adapter.rxjava.HttpException;
import rx.Subscriber;

/**
* @author xzj
* @date 2016/8/25 11:07.
*/
public abstract class ResponseSubscriber<T> extends Subscriber<T> {
private Context mContext;

public ResponseSubscriber(Context context) {
mContext = context;
}

@Override
public void onCompleted() {

}

@Override
public void onError(Throwable e) {
if (!error(e)) {
if (e instanceof ConnectException) {
//网络异常
Toast.makeText(mContext, R.string.network_error,Toast.LENGTH_SHORT).show();
} else if (e instanceof HttpException) {
//服务器异常
Toast.makeText(mContext, R.string.network_servier_error,Toast.LENGTH_SHORT).show();
} else if (e instanceof SocketTimeoutException) {
//网络超时
Toast.makeText(mContext, R.string.network_timeout,Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(mContext,e.getMessage(),Toast.LENGTH_SHORT).show();
}
}

}

@Override
public void onNext(T t) {
BaseJsonBean data;
if (t instanceof BaseJsonBean) {
data = (BaseJsonBean) t;
if (data.success) { //服务端返回的是true
success(t);
} else { //服务端返回false,就是操作异常
if (!operationError(t, data.errorCode, data.msg)) { //可以复写此方法,返回true,就用户自己处理,返回false,走下面的代码
Toast.makeText(mContext,data.msg,Toast.LENGTH_SHORT).show();
}
}
} else {
success(t);
}
}

/**
* 请求成功同时业务成功的情况下会调用此函数
*/
public abstract void success(T t);

/**
* 请求成功但业务失败的情况下会调用此函数.
* @return 空实现,默认返回false,执行父类方法。 用户可以复写此方法,返回true来自己处理
*/
public boolean operationError(T t, int errorCode, String message) {
return false;
}

/**
* 请求失败的情况下会调用此函数
* @return 空实现,默认返回false,执行父类方法。 用户可以复写此方法,返回true来自己处理
*/
public boolean error(Throwable e) {
return false;
}
}

package com.aidebar.retrofitutils.Utils.RetrofitUtils;

import rx.Observable;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;

/**
* 用于对网络请求的Observable做转换.
* 配合{@link com.trello.rxlifecycle.ActivityLifecycleProvider#bindToLifecycle()}一起使用
* 可以将原始Observable绑定至Activity/Fragment生命周期, 同时声明在IO线程运行, 在main线程接收.
* 像这样用
* manager.getAds().compose(new ResponseTransformer<>(this.<BaseJsonBean> bindToLifeCycle()));
*/
public class ResponseTransformer<T> implements Observable.Transformer<T, T> {

private Observable.Transformer<T, T> transformer;

public ResponseTransformer() {}

public ResponseTransformer(Observable.Transformer<T, T> t) {
transformer = t;

}

@Override
public Observable<T> call(Observable<T> source) {
if (transformer != null)
return transformer.call(source).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
else
return source.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
}