如果项目没有用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);
                }
            }
        });

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐