描述:
应用中全局添加网络请求提示自定义Toast,即每个接口请求前显示自定义Dialog, 请求后不管成功还是失败Dialog消失。
初步解决方案:
public class NetInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request().newBuilder().build();
String url = request.url().toString();
Response response = null;
try {
//请求前显示自定义Dialog
if (NetValidator.valide(url)) {//有的页面多个接口,或者定时任务的接口不显示,这里通过接口url来判断一下显示不显示的问题
//当前线程是子线程,Thread[RxCachedThreadScheduler-3,5,main], 需要在主线程显示Dialog
//将url传到Dialog中,根据不同接口,显示不同的提示语
AppcationHome.getTopActivity().runOnUiThread(() -> DialogUtils.showNetDialog(url));
}
response = chain.proceed(request);
} finally {
//请求后不管成功还是失败,Dialog消失, 这里设置一个定时,防止请求过快,Dialog闪一下就消失,甚至不显示的情况。
//但是定时太长影响用户体验
Observable.timer(500, TimeUnit.MILLISECONDS)
.observeOn(Schedulers.newThread())
.subscribeOn(AndroidSchedulers.mainThread())
.subscribe(aLong -> DialogUtils.dismissNetDialog());
}
return response;
}
}
public class NetValidator {
public static boolean valide(String url) {
return !url.contains("a") &&
!url.contains("b") &&
!url.contains("c");
}
}
发现问题:
项目中用到Java和Php两种接口,以上针对Java接口是行的通的。
而Php接口规定将请求的数据全部放到请求体中,所有的url都是一样的。
这样便无法通过url来判断显示不显示,及显示什么提示语的逻辑。
此时需要获取请求体中我们定义的标识来判断
进一步解决方案
public class NetInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request().newBuilder().build();
String url = request.url().toString();
String phpFunction = getPhpFunction(request, url);
Response response = null;
try {
if (NetValidator.valide(url + phpFunction)) {//php通过phpFunction来判断, java通过url来判断
AppcationHome.getTopActivity().runOnUiThread(() -> DialogUtils.showNetDialog(url + phpFunction));
}
response = chain.proceed(request);
} finally {
Observable.timer(500, TimeUnit.MILLISECONDS)
.observeOn(Schedulers.newThread())
.subscribeOn(AndroidSchedulers.mainThread())
.subscribe(aLong -> DialogUtils.dismissNetDialog());
}
return response;
}
//如何获得okhttp请求的请求体
private String getPhpFunction(Request request, String url) {
String function = "";
if(url.equals("http://abc.com/apiv2/")) {//php接口地址
try {
Buffer sink = new Buffer();
request.body().writeTo(sink);
String json = sink.readString(Charset.defaultCharset());
JSONObject jsonObject = new JSONObject(json);
function = jsonObject.getString("f");
} catch (JSONException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
return function;
}
}
网友评论