228 lines
8.3 KiB
Plaintext
228 lines
8.3 KiB
Plaintext
|
package com.novelbook.android.netutils;
|
|||
|
|
|||
|
import android.app.ProgressDialog;
|
|||
|
import android.content.Context;
|
|||
|
import android.util.Log;
|
|||
|
import android.widget.Toast;
|
|||
|
|
|||
|
import org.json.JSONObject;
|
|||
|
|
|||
|
import java.net.ConnectException;
|
|||
|
import java.net.SocketTimeoutException;
|
|||
|
import java.net.UnknownHostException;
|
|||
|
|
|||
|
import javax.net.ssl.SSLHandshakeException;
|
|||
|
|
|||
|
import io.reactivex.observers.DisposableObserver;
|
|||
|
import okhttp3.HttpUrl;
|
|||
|
import okhttp3.ResponseBody;
|
|||
|
import retrofit2.HttpException;
|
|||
|
import retrofit2.Response;
|
|||
|
|
|||
|
/**
|
|||
|
* Created by 眼神 on 2018/3/27.
|
|||
|
* 用于在Http请求开始时,自动显示一个ProgressDialog
|
|||
|
* 在Http请求结束是,关闭ProgressDialog
|
|||
|
* 调用者自己对请求数据进行处理 成功时 通过result是否等于1分别回调onSuccess和onFault,默认处理了401错误转登录。
|
|||
|
* 回调结果为String,需要手动序列化
|
|||
|
*/
|
|||
|
|
|||
|
public class OnSuccessAndFaultSub extends DisposableObserver<ResponseBody>
|
|||
|
implements ProgressCancelListener {
|
|||
|
private static final String TAG= OnSuccessAndFaultSub.class.getSimpleName();
|
|||
|
/**
|
|||
|
* 是否需要显示默认Loading
|
|||
|
*/
|
|||
|
private boolean showProgress = true;
|
|||
|
private OnSuccessAndFaultListener mOnSuccessAndFaultListener;
|
|||
|
|
|||
|
private Context context;
|
|||
|
private ProgressDialog progressDialog;
|
|||
|
|
|||
|
|
|||
|
/**
|
|||
|
* @param mOnSuccessAndFaultListener 成功回调监听
|
|||
|
*/
|
|||
|
public OnSuccessAndFaultSub(OnSuccessAndFaultListener mOnSuccessAndFaultListener) {
|
|||
|
this.mOnSuccessAndFaultListener = mOnSuccessAndFaultListener;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/**
|
|||
|
* @param mOnSuccessAndFaultListener 成功回调监听
|
|||
|
* @param context 上下文
|
|||
|
*/
|
|||
|
public OnSuccessAndFaultSub(OnSuccessAndFaultListener mOnSuccessAndFaultListener, Context context) {
|
|||
|
this.mOnSuccessAndFaultListener = mOnSuccessAndFaultListener;
|
|||
|
if(context!=null) {
|
|||
|
this.context = context;
|
|||
|
progressDialog = new ProgressDialog(context);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/**
|
|||
|
* @param mOnSuccessAndFaultListener 成功回调监听
|
|||
|
* @param context 上下文
|
|||
|
* @param showProgress 是否需要显示默认Loading
|
|||
|
*/
|
|||
|
public OnSuccessAndFaultSub(OnSuccessAndFaultListener mOnSuccessAndFaultListener, Context context, boolean showProgress) {
|
|||
|
this.mOnSuccessAndFaultListener = mOnSuccessAndFaultListener;
|
|||
|
this.context = context;
|
|||
|
progressDialog = new ProgressDialog(context);
|
|||
|
this.showProgress = showProgress;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
private void showProgressDialog() {
|
|||
|
if (showProgress && null != progressDialog) {
|
|||
|
progressDialog.setMessage("正在请求网络");
|
|||
|
// progressDialog.show();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
private void dismissProgressDialog() {
|
|||
|
if (showProgress && null != progressDialog) {
|
|||
|
progressDialog.dismiss();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/**
|
|||
|
* 订阅开始时调用
|
|||
|
* 显示ProgressDialog
|
|||
|
*/
|
|||
|
@Override
|
|||
|
public void onStart() {
|
|||
|
showProgressDialog();
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/**
|
|||
|
* 完成,隐藏ProgressDialog
|
|||
|
*/
|
|||
|
@Override public void onComplete() {
|
|||
|
dismissProgressDialog();
|
|||
|
progressDialog = null;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/**
|
|||
|
* 对错误进行统一处理
|
|||
|
* 隐藏ProgressDialog
|
|||
|
*/
|
|||
|
@Override
|
|||
|
public void onError(Throwable e) {
|
|||
|
try {
|
|||
|
|
|||
|
if (e instanceof SocketTimeoutException) {
|
|||
|
mOnSuccessAndFaultListener.onFault("网络连接超时");
|
|||
|
//请求超时
|
|||
|
} else if (e instanceof ConnectException) {//网络连接超时
|
|||
|
// ToastManager.showShortToast("网络连接超时");
|
|||
|
mOnSuccessAndFaultListener.onFault("网络连接超时");
|
|||
|
} else if (e instanceof SSLHandshakeException) {//安全证书异常
|
|||
|
// ToastManager.showShortToast("安全证书异常");
|
|||
|
mOnSuccessAndFaultListener.onFault("安全证书异常");
|
|||
|
} else if (e instanceof HttpException) {//请求的地址不存在
|
|||
|
int code = ((HttpException) e).code();
|
|||
|
|
|||
|
Response<?> response = ((HttpException) e).response();
|
|||
|
HttpUrl url= response.raw().request().url();
|
|||
|
String host = url.host();
|
|||
|
String key = url.query();
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
if (code == 504) {
|
|||
|
Toast.makeText(context,"网络异常,请检查您的网络状态",Toast.LENGTH_LONG).show();
|
|||
|
mOnSuccessAndFaultListener.onFault("网络异常,请检查您的网络状态");
|
|||
|
} else if (code == 404) {
|
|||
|
// ToastManager.showShortToast("请求的地址不存在");
|
|||
|
mOnSuccessAndFaultListener.onFault("请求的地址不存在");
|
|||
|
} else if (code == 401) {
|
|||
|
// ToastManager.showShortToast("请求的地址不存在");
|
|||
|
mOnSuccessAndFaultListener.onFault("权限验证错误");
|
|||
|
} else if(code == 500) {
|
|||
|
// Toast.makeText(context,"网关错误 ,请检查您的网络状态",Toast.LENGTH_LONG).show();
|
|||
|
mOnSuccessAndFaultListener.onFault("服务错误");
|
|||
|
} else if(code == 503) {
|
|||
|
// Toast.makeText(context,"网关错误 ,请检查您的网络状态",Toast.LENGTH_LONG).show();
|
|||
|
//sleep 200
|
|||
|
mOnSuccessAndFaultListener.onFault("服务限制");
|
|||
|
}else if(code == 502) {
|
|||
|
// HttpMethods.getInstance().changeBaseUrl(); //更新基本信息
|
|||
|
try {
|
|||
|
Toast.makeText(context, "服务器开小差了,请重试", Toast.LENGTH_LONG).show();
|
|||
|
}catch (Exception e3){
|
|||
|
Log.e(TAG, "prepare book onError: ",e3);
|
|||
|
}
|
|||
|
mOnSuccessAndFaultListener.onFault("服务器开小差了,请重试");
|
|||
|
}else {
|
|||
|
// ToastManager.showShortToast("请求失败");
|
|||
|
mOnSuccessAndFaultListener.onFault("请求失败");
|
|||
|
}
|
|||
|
} else if (e instanceof UnknownHostException) {//域名解析失败
|
|||
|
// ToastManager.showShortToast("域名解析失败");
|
|||
|
mOnSuccessAndFaultListener.onFault("域名解析失败");
|
|||
|
} else {
|
|||
|
// ToastManager.showShortToast("error:" + e.getMessage());
|
|||
|
mOnSuccessAndFaultListener.onFault("error:" + e.getMessage());
|
|||
|
}
|
|||
|
} catch (Exception e2) {
|
|||
|
Log.e(TAG, "prepare book onError: ",e );
|
|||
|
} finally {
|
|||
|
Log.e("OnSuccessAndFaultSub", "error:" + e);
|
|||
|
// mOnSuccessAndFaultListener.onFault("error:" + e.getMessage());
|
|||
|
dismissProgressDialog();
|
|||
|
progressDialog = null;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/**
|
|||
|
* 当result等于1回调给调用者,否则自动显示错误信息,若错误信息为401跳转登录页面。
|
|||
|
* ResponseBody body = response.body();//获取响应体
|
|||
|
* InputStream inputStream = body.byteStream();//获取输入流
|
|||
|
* byte[] bytes = body.bytes();//获取字节数组
|
|||
|
* String str = body.string();//获取字符串数据
|
|||
|
*/
|
|||
|
@Override
|
|||
|
public void onNext(ResponseBody body) {
|
|||
|
try {
|
|||
|
// final String result = CompressUtils.decompress(body.byteStream());
|
|||
|
final String result =body.string();
|
|||
|
// Log.e("body", result);
|
|||
|
JSONObject jsonObject = new JSONObject(result);
|
|||
|
int resultCode = jsonObject.getInt("code");
|
|||
|
if (resultCode == 0) {
|
|||
|
mOnSuccessAndFaultListener.onSuccess(jsonObject.getString("data"));
|
|||
|
} else {
|
|||
|
String errorMsg = jsonObject.getString("message");
|
|||
|
mOnSuccessAndFaultListener.onFault(errorMsg);
|
|||
|
Log.e("OnSuccessAndFaultSub", "errorMsg: " + errorMsg);
|
|||
|
}
|
|||
|
} catch (Exception e) {
|
|||
|
Log.e(TAG, "prepare book error: ",e );
|
|||
|
e.printStackTrace();
|
|||
|
// Toast.makeText(context,"出错了" + e.getMessage(),Toast.LENGTH_LONG);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/**
|
|||
|
* 取消ProgressDialog的时候,取消对observable的订阅,同时也取消了http请求
|
|||
|
*/
|
|||
|
@Override
|
|||
|
public void onCancelProgress() {
|
|||
|
if (!this.isDisposed()) {
|
|||
|
this.dispose();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|