rxjava使用自定义的callback

rxjava使用自定义的callback

问题描述:

老师,开屏页采用rxjava+retrofit调接口;而其他页面采用okhttp二次封装的library。封装的library中包含自定义的callback 继承okhttp Callback,实现了请求成功或异常的公共处理逻辑。现在开屏页也想使用这个callback,请问应该怎么做?


相关代码:

开屏页
//合并多个网络请求并发送
​Observable
.concat(versionObservable, geeObservable)
.subscribeOn(Schedulers.io()) //指定网络请求在io线程
.observeOn(AndroidSchedulers.mainThread()) //指定数据返回在主线程
.subscribe(observer);
private final Observer<BaseResponse> observer = new Observer<BaseResponse>() {

@Override
public void onSubscribe(@NonNull Disposable d) {

}

@Override
public void onNext(@NonNull BaseResponse resp) {
PLog.e("onNext," + GsonUtil.GsonString(resp));
handleResp(resp);
}

@Override
public void onError(@NonNull Throwable e) {
PLog.e("onError,==" + e.getMessage());
checkRoot();
}

@Override
public void onComplete() {
PLog.e("onComplete");
}
};

其他页面:

@Get(value = UrlConstant.geetestRegister)
public void geetestRegister(String deviceIdentification,String ipAddr, String bizScene, HttpCallback<GeetestRegisterResponse> callBack) {
RequestParams params = new RequestParams();
params.put("deviceIdentification",deviceIdentification);
params.put("ipAddress", ipAddr);
params.put("bizScene", bizScene);
Request request = setData(params);
InitializeClient.connectHttp(request, new HttpCommCallback<GeetestRegisterResponse>(callBack ,GeetestRegisterResponse.class, context));
}

自定义的Callback

​package com.phdj.common.http;

import android.content.Context;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import android.widget.Toast;

import com.google.gson.Gson;
import com.phdj.common.util.PLog;
import com.phdj.http.model.response.BaseResponse;
import com.phdj.pevent.PEventManager;
import com.phdj.storage.LogUtils;
import com.phdj.storage.PrefsConstant;
import com.phdj.storage.SPUilsCommFunction;
import com.phdj.storage.SPUtils;

import org.jetbrains.annotations.NotNull;

import java.io.IOException;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Response;

public class HttpCommCallback<T extends BaseResponse> implements Callback {
private Handler mHandler;
private Gson gson = new Gson();
private HttpCallback<T> httpCallback;
private Class<T> mClass;
private Context context;


public HttpCommCallback(HttpCallback<T> httpCallback, Class<T> mClass, Context context) {
this.httpCallback = httpCallback;
if (this.httpCallback != null) {
this.httpCallback.setContext(context);
}
this.mClass = mClass;
this.context = context;
mHandler = new Handler(Looper.getMainLooper());
}


@Override
public void onFailure(@NotNull Call call, @NotNull IOException e) {
mHandler.post(new Runnable() {
@Override
public void run() {
//异常原因造成失败
Log.d("请求异常:", String.valueOf(e));
e.printStackTrace();
httpCallback.onError();
httpCallback.onFinally();
}
});
}

@Override
public void onResponse(@NotNull Call call, @NotNull final Response response) {
try {
if (response.code() == 200) {
String body = response.body().string();
PLog.e("@@@@",body);
// try {
// ResponseEncrypt responseEncrypt = gson.fromJson(body, ResponseEncrypt.class);
// if(responseEncrypt != null && responseEncrypt.getValue() != null) {
// body = Util.privateDecrypt(responseEncrypt.getValue());
// LogUtils.d("HttpBaseCallback", body);
// }
// } catch (Exception e) {
// e.printStackTrace();
// }
final T result = gson.fromJson(body, mClass);
//result.setCode("999999999999");
//String test = "{\"mode\":\"alert\", \"title\": \"提示信息\", \"handles\": [{\"text\": \"确定\", \"function\":\"pushUrl\", \"androidUrl\":\"https://a.app.qq.com/o/simple.jsp?pkgname=com.baoli.blzj\", \"iosUrl\":\"https://a.app.qq.com/o/simple.jsp?pkgname=com.baoli.blzj\"}]}";
//String test = "{\"mode\":\"alert\", \"title\": \"提示信息\",\"msg\": \"抱歉!您的APP不是最新版,请点击【确认】完成更新!\", \"handles\": [{\"text\": \"确定\", \"function\":\"updates\", \"androidUrl\":\"https://a.app.qq.com/o/simple.jsp?pkgname=com.baoli.blzj\", \"iosUrl\":\"https://a.app.qq.com/o/simple.jsp?pkgname=com.baoli.blzj\"}, {\"text\": \"取消\", \"function\":\"closeCurrentPage\"}]}";
//String test = "{\"mode\":\"slient\", \"function\": \"replaceCurrentpage\" , \"androidUrl\": \"https://esmstore.spdb.com.cn/uatweb/newUI/h5/?appId=1009&loginType=3&payType=2&color=EE2F51&patternId=18#/pages/mine/coupon/coupon\"}";
//result.setMessage(test);


//处理网络,处理请求码
mHandler.post(new Runnable() {
@Override
public void run() {
//接口回调,回主线程
if (result == null) {
httpCallback.onError("500", "系统后台异常");
showToast("系统后台异常");
} else if (("000000000000".equals(result.getCode()) ||
"100000".equals(result.getCode()) || "200".equals(result.getCode()))) {
httpCallback.onSuccess(result);
} else if ("000000000401".equals(result.getCode()) || "000000000402".equals(result.getCode())
|| "000000000403".equals(result.getCode()) || "000000000404".equals(result.getCode())) {
SPUilsCommFunction.clearUser();
PEventManager.getInstance().postEvent("relogin", result.getMessage());
if (!"000000000402".equals(result.getCode())) {
httpCallback.onError(result.getCode(), result.getMessage());
}
} else if ("000100201105".equals(result.getCode())) {
SPUtils.put(PrefsConstant.TOKEN, "");
} else if (HttpExceptionCode.SpecialHandlingCode.equals(result.getCode())) {
httpCallback.handler(result.getMessage()); //特殊异常处理
} else {
if (result.getCode() != null) {
httpCallback.onError(result.getCode(), result.getMessage());
LogUtils.e("@@@@", result.getMessage());
// showToast(result.getMessage());
} else {
httpCallback.onError();
showToast("数据加载失败,请稍后在试");
}
}
}
});
} else if (response.code() == 429) {
mHandler.post(new Runnable() {
@Override
public void run() {
httpCallback.onError(String.valueOf(response.code()), "活动过于火爆,请稍后再试");
showToast("活动过于火爆,请稍后再试");
}
});
} else if (response.code() == 404) {
mHandler.post(new Runnable() {
@Override
public void run() {
httpCallback.onError(String.valueOf(response.code()), "找不到服务器");
// showToast("找不到服务器");如果后端返回404,那么前端多个地方都会弹此提示,所以注释
}
});
} else {
mHandler.post(new Runnable() {
@Override
public void run() {
httpCallback.onError(String.valueOf(response.code()), response.code() + " 存在异常");
showToast(response.code() + " 存在异常");
}
});
}
} catch (Exception e) {
e.printStackTrace();
mHandler.post(new Runnable() {
@Override
public void run() {
LogUtils.d("HttpBaseCallback", response.code() + e.getMessage());
httpCallback.onError(String.valueOf(response.code()), e.getMessage());
}
});
} finally {
mHandler.post(new Runnable() {
@Override
public void run() {
httpCallback.onFinally();
}
});
}
}


private void showToast(String message) {
Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
}

}


正在回答

登陆购买课程后可参与讨论,去登陆

1回答

那只需要把开屏页的接口,按照你封装后的格式去写就行了啊?,至于rxjava就不用它了

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师