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