1、引入依赖
implementation 'com.squareup.retrofit2:retrofit:2.1.0'
implementation 'com.squareup.okhttp3:okhttp:3.4.1'
implementation 'com.squareup.okhttp3:logging-interceptor:3.3.1'
implementation 'com.squareup.retrofit2:converter-gson:2.1.0'
implementation 'io.reactivex.rxjava2:rxjava:2.2.10'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.6.0'
implementation 'com.squareup.retrofit2:converter-scalars:2.6.0'
2、编写api接口
public interface AppApi {
//用户登录
@POST("/app/checkLogin")
Observable<BaseResponse<LoginResponse>> pswLogin(@Body RequestBody requestBody);
// 获取首页饼状图,在线设备状态
@POST("/app/getDeviceStatusChart")
Observable<BaseResponse<DeviceStatusResponse>> getDeviceStatusChart(@Body Map<String, String> request);
// POST /app/alarm/getDataHisAlarmList
// 获取历史告警列表
@POST("/app/getAlarmList")
Observable<BaseResponse<JSONObject>> getDeviceAlarmList(@Body SearchAlarm searchAlarm);
// 获取视频设备列表
@POST("/app/deviceVideo/getVideoList")
Observable<BaseResponse<List<DeviceVideoResponse>>> getDeviceVideoList(@Body DeviceListRequest request);
@POST("app/storeTimeInterval")
Observable<BaseResponse<JSONObject>> appStoreTimeInterval(@Query("organizeIds") String organizeIds,@Query("interval") String interval);
//视频设备 基本信息
@POST("/app/deviceVideo/getDeviceVideo")
Observable<BaseResponse<DeviceVideoInfoResponse>> getDeviceVideo(@Body Map<String, String> request);
@Multipart
//文件上传
@POST("app/uploadVoiceAudio")
Observable<BaseResponse<JSONObject>> uploadVoiceAudio(@Part MultipartBody.Part voiceAudio,@Query("oIds") String oIds,@Query("count") int count);
}
代理api接口RetrofitClient
public class RetrofitClient {
private static final RetrofitClient mInstance = new RetrofitClient();
private static final String TAG ="RetrofitClient" ;
private AppApi mAppApi;
public String s ;
private String mCookie;
public static RetrofitClient getInstance() {
return mInstance;
}
private RetrofitClient() {
}
public AppApi getAppApi() {
Log.d(TAG, "getAppApi: "+IConstantImpl.BASE_URL);
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.retryOnConnectionFailure(true)
.connectTimeout(20, TimeUnit.SECONDS)
.readTimeout(20, TimeUnit.SECONDS)
.writeTimeout(20, TimeUnit.SECONDS)
.addInterceptor(sLoggingInterceptor)
.build();
Retrofit retrofit = new Retrofit.Builder()
.client(okHttpClient)
.baseUrl(IConstantImpl.BASE_URL)
.addConverterFactory(ResponseConverterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(ScalarsConverterFactory.create())
.build();
if (mAppApi == null) {
mAppApi = retrofit.create(AppApi.class);
}
return mAppApi;
}
/**
* 打印返回的json数据拦截器
*/
private static final Interceptor sLoggingInterceptor = new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
final Request request = chain.request();
Buffer requestBuffer = new Buffer();
if (request.body() != null) {
request.body().writeTo(requestBuffer);
} else {
Log.d("LogTAG", "request.body() == null");
}
//打印url信息
Log.w("LogTAG",request.url() + (request.body() != null ? "?" + _parseParams(request.body(), requestBuffer) : ""));
Response response = chain.proceed(request);
/** DEBUG STUFF */
//I am logging the response body in debug mode. When I do this I consume the response (OKHttp only lets you do this once) so i have re-build a new one using the cached body
String bodyString = response.body().string();
System.out.println(String.format("Sending request %s with headers %s ", request.url(), request.headers()));
System.out.println(String.format("Got response HTTP %s %s \n\n with body %s \n\n ", response.code(), response.message(), bodyString));
response = response.newBuilder().body(ResponseBody.create(response.body().contentType(), bodyString)).build();
return response;
}
};
@NonNull
private static String _parseParams(RequestBody body, Buffer requestBuffer) throws UnsupportedEncodingException {
if (body.contentType() != null && !body.contentType().toString().contains("multipart")) {
return URLDecoder.decode(requestBuffer.readUtf8(), "UTF-8");
}
return "null";
}
}
线程调度
public class SchedulersCompat {
public static <T> ObservableTransformer<T, T> defaultSchedulers() {
return new ObservableTransformer<T, T>() {
@Override
public ObservableSource<T> apply(Observable<T> upstream) {
return upstream.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
};
}
}
使用
public class DataManager {
private static DataManager sInstance = new DataManager();
private static AppApi mAppApi;
private String TAG="DEBUGDataManager";
private Map<String,String> mDeviceSerialVerifyCodeMap = new HashMap<String,String>();
public static DataManager getsInstance() {
if (mAppApi == null) {
mAppApi = RetrofitClient.getInstance().getAppApi();
}
return sInstance;
}
public Observable<BaseResponse<com.alibaba.fastjson.JSONObject>> appDelThresholds(String texts)
{
return mAppApi.appDelThresholds(texts).compose(SchedulersCompat.<BaseResponse<com.alibaba.fastjson.JSONObject>>defaultSchedulers());
}
转换器工厂
public class ResponseConverterFactory extends Converter.Factory {
public static ResponseConverterFactory create() {
return create(new Gson());
}
public static ResponseConverterFactory create(Gson gson) {
return new ResponseConverterFactory(gson);
}
private final Gson gson;
private ResponseConverterFactory(Gson gson) {
if (gson == null) throw new NullPointerException("gson == null");
this.gson = gson;
}
@Override
public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) {
//返回我们自定义的Gson响应体变换器
return new GsonResponseBodyConverter<>(gson, type);
}
}
转换器
public class GsonResponseBodyConverter<T> implements Converter<ResponseBody, T> {
private final Gson gson;
private final Type type;
public GsonResponseBodyConverter(Gson gson, Type type) {
this.gson = gson;
this.type = type;
}
@Override
public T convert(ResponseBody value) throws IOException {
String response = value.string();
//先将返回的json数据解析到Response中,如果code==200,则解析到我们的实体基类中,否则抛异常
Response httpResponse = gson.fromJson(response, Response.class);
if (httpResponse.getCode() == 200) {
//正确的时候就直接解析,不可能出现解析异常。因为我们实体基类中传入的泛型,就是数据成功时候的格式
return gson.fromJson(response, type);
} else {
//抛一个自定义ResultException
throw new ResultException(httpResponse.getCode(), httpResponse.getMsg());
}
}
}
Response实体类
public class Response {
private int code;
private String msg;
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
自定义异常
public class ResultException extends RuntimeException {
private int errCode;
private String msg;
public ResultException(int errCode, String msg) {
super();
this.errCode = errCode;
this.msg = msg;
}
public int getErrCode() {
return errCode;
}
public String getMsg() {
return msg;
}
@Override
public String toString() {
return msg;
}
@Override
public String getMessage() {
return msg;
}
}
观察者
public abstract class BaseSubscriber<T extends BaseResponse> implements Observer<T> {
private static final String TAG = "BaseSubscriber";
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(T t) {
onSuccess(t);
}
@Override
public void onError(Throwable e) {
Log.d(TAG, "onError: ");
if (e.toString().equals("该账户不存在")) {
ActivityUtils.startActivity(LoginActivity.class);
}
LogUtils.w("网络异常: " + e.toString());
if (!NetUtils.isNetworkConnected(BaseApplication.getContext())) {
onFail("请打开手机网络");
} else if (e instanceof SocketTimeoutException || e instanceof TimeoutException) {
onFail("网络请求超时,请检查您的网络状态");
} else if (e instanceof ConnectException) {
onFail("请求中断,请检查您的网络状态");
} else if (e instanceof ResultException) {
LogUtils.w("error == code!=200 code == " + ((ResultException) e).getErrCode());
if (((ResultException) e).getErrCode() == 421) {
ActivityUtils.startActivity(LoginActivity.class);
BaseTimer.getInstans().killTimer();
return;
}
if (((ResultException) e).getErrCode() == 401) {
ActivityUtils.startActivity(LoginActivity.class);
return;
}
onFail(((ResultException) e).getMsg());
} else {
onFail("" + e.getMessage());
}
}
@Override
public void onComplete() {
}
public abstract void onFail(String errorMsg);
public abstract void onSuccess(T t);
}
网络状态工具类
public class NetUtils {
public static enum NetType {
WIFI, CMNET, CMWAP, NONE
}
public static boolean isNetworkAvailable(Context context) {
ConnectivityManager mgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo[] info = mgr.getAllNetworkInfo();
if (info != null) {
for (int i = 0; i < info.length; i++) {
if (info[i].getState() == NetworkInfo.State.CONNECTED) {
return true;
}
}
}
return false;
}
public static boolean isNetworkConnected(Context context) {
try {
if (context != null) {
ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();
if (mNetworkInfo != null) {
return mNetworkInfo.isAvailable();
}
}
} catch (Exception e) {
LogUtils.w(e.toString());
return false;
}
return false;
}
public static boolean isWifiConnected(Context context) {
if (context != null) {
ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mWiFiNetworkInfo = mConnectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
if (mWiFiNetworkInfo != null) {
return mWiFiNetworkInfo.isAvailable();
}
}
return false;
}
public static boolean isMobileConnected(Context context) {
if (context != null) {
ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mMobileNetworkInfo = mConnectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
if (mMobileNetworkInfo != null) {
return mMobileNetworkInfo.isAvailable();
}
}
return false;
}
public static int getConnectedType(Context context) {
if (context != null) {
ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();
if (mNetworkInfo != null && mNetworkInfo.isAvailable()) {
return mNetworkInfo.getType();
}
}
return -1;
}
public static NetType getAPNType(Context context) {
ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
if (networkInfo == null) {
return NetType.NONE;
}
int nType = networkInfo.getType();
if (nType == ConnectivityManager.TYPE_MOBILE) {
if (networkInfo.getExtraInfo().toLowerCase(Locale.getDefault()).equals("cmnet")) {
return NetType.CMNET;
} else {
return NetType.CMWAP;
}
} else if (nType == ConnectivityManager.TYPE_WIFI) {
return NetType.WIFI;
}
return NetType.NONE;
}
}
本文介绍如何使用Retrofit实现网络请求,包括依赖引入、API接口编写、请求响应处理及异常管理等内容。
507

被折叠的 条评论
为什么被折叠?



