关健做法:
方法一okhttp处理
在okhttp的request执行build()方法之前加上tag标记
判断activity是否已经销毁,如果已经销毁
就便利Call对象 ,并通过Call对象拿到request的tag标记,如果跟前面定义的一致就
用Call.cancel()取消网络请求
方法二Retrofit处理:
1,定义一个类,类里面创建一个键值对集合ConcurrentHashMap<String, Boolean>来标记页面存活状态并添加下面两个页面创建以及销毁的方法。
private static ConcurrentHashMap<String, Boolean> actLiveMap = new ConcurrentHashMap<>(); // 标记Activity是否存活
public static void markPageAlive(String actName) {
actLiveMap.put(actName, true);
}
public static void markPageDestroy(String actName) {
actLiveMap.put(actName, false);
}
2.在Activity的OnCreate和OnDestroy方法你们分别对应上面两个方法进行添加
3.给请求接口类的请求方法的参数上加上header
@Header(NetworkCenter.HEADER_ACT_NAME) @Nullable String actName,
4.继承okhttp拦截器创建一个自定义拦截器,并在通过拦截器的chain拿到request对象
并通过该对象拿到header,最终拿到activity的存活状态,如果存活就什么也不做,如果不存活就使用chain.call().cancel();来取消请求,最后执行
Request newRequest = request.newBuilder().removeHeader(HEADER_ACT_NAME).build();
return chain.proceed(newRequest);
}
将Header移出
5.在okhttp bulid()前将自定义拦截器传入即可.
网友评论