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 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(); } } }