pda/zhuike/.svn/pristine/3c/3ca1f588e95558fc3aef93bcc9a...

228 lines
8.3 KiB
Plaintext
Raw Permalink Normal View History

2024-02-06 22:23:29 +08:00
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();
}
}
}