Okhttp在页面结束的时候取消请求,防止内存泄漏
如果项目没有用mvp和mvvm这种框架自带解决网络请求内存泄漏,用的mvc处理内存泄漏的时候可以考虑rxjava解绑或直接取消okhttp的请求,下面这个方法就是直接取消okhttp的请求的方法如果有tag并且tag是LifecycleOwner可以这样写//tag直接用LifecycleOwner最方便if (tag instanceofLifecycleOwner){LifecycleOwne
·
如果项目没有用mvp和mvvm这种框架自带解决网络请求内存泄漏,用的mvc处理内存泄漏的时候可以考虑rxjava解绑或直接取消okhttp的请求,下面这个方法就是直接取消okhttp的请求的方法
如果有tag并且tag是LifecycleOwner可以这样写
//tag直接用LifecycleOwner最方便
if (tag instanceof LifecycleOwner){
LifecycleOwner lifecycleOwner = (LifecycleOwner) tag;
lifecycleOwner.getLifecycle().addObserver(new LifecycleEventObserver() {
@Override
public void onStateChanged(@NonNull LifecycleOwner source, @NonNull Lifecycle.Event event) {
if (event == Lifecycle.Event.ON_DESTROY){
cancelTag(tag);
lifecycleOwner.getLifecycle().removeObserver(this);
}
}
});
}
//请求的时候记得传tag
Request request = new Request.Builder()
.url(url)
.post(RequestBody.create(mediaType, requestBody))
.tag(tag)
.build();
OKHttpClient.client().newCall(request).enqueue(new Callback() {
//页面destroy的时候调用
public void cancelTag(Object tag) {
if (tag == null)
return;
for (Call call : OKHttpClient.client().dispatcher().queuedCalls()) {
if (tag.equals(call.request().tag())) {
call.cancel();
}
}
for (Call call : OKHttpClient.client().dispatcher().runningCalls()) {
if (tag.equals(call.request().tag())) {
call.cancel();
}
}
}
请求的时候如果没有设置tag,可以直接取消
owner.getLifecycle().addObserver(new LifecycleEventObserver() {
@Override
public void onStateChanged(@NonNull LifecycleOwner source, @NonNull Lifecycle.Event event) {
if (event == Lifecycle.Event.ON_DESTROY) {
for (Call call : okhttpClient.dispatcher().queuedCalls()) {
call.cancel();
}
for (Call call : okhttpClient.dispatcher().runningCalls()) {
call.cancel();
}
source.getLifecycle().removeObserver(this);
}
}
});
更多推荐



所有评论(0)