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

228 lines
8.3 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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