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