nohttp框架的OnResponseListener内存泄漏问题

fenlyer 2017-06-19 02:17:54
不管回调函数里面写了什么,只要页面跳转,LeakCanary就会弹出来内存泄漏。




求助大神
...全文
278 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
changchengworld 2018-01-12
  • 打赏
  • 举报
回复
对象持有顺序是这样的:你的Activity->ResponseListener->Request->RequestDispatcher,我注意到RequestDispatcher里面有这样一行代码Response<?> response = SyncRequestExecutor.INSTANCE.execute(request); SyncRequestExecutor这个类被做成了一个单例,具体调用链路很长,但是我怀疑也就是它一直间接持有着Request引用导致Request无法释放。当你的Activity关闭的时候,Request对象却无法释放,等于你的ResponseListener无法释放,最终导致你的Activity无法释放。解决方式可以试试看把ResponseListener做成静态内部类,解除对Activity的引用,如果需要在ResponseListener里用到外部类Activity的方法,就把Activity以WeakReference包裹传递进来,这样Activity就能顺利释放了
fenlyer 2017-06-20
  • 打赏
  • 举报
回复
HttpUtils.loginRequest(MD5Tool.md5(name), MD5Tool.md5(password), new OnResponseListener<String>() {

                    @Override
                    public void onStart(int what) {
                    }

                    @Override
                    public void onSucceed(int what, Response<String> response) {

                        //根据返回的数据进行判断,如果是判断出登录失败那么吐司,否则跳转
                        //"wrong".equal(response.getString())
                        if (false) {
                            ToastUtils.show("用户名或者密码错误");
                        } else {
                            String json = response.get();
                            User user = new Gson().fromJson(json, User.class);
                            SharedPreferencesTool.saveString(MyApp.getContext(), Constants.ORGCODE, user.getORG_CODE());
                            SharedPreferencesTool.saveString(MyApp.getContext(), Constants.USERTYPE, user.getUSER_TYPE());
                            SharedPreferencesTool.saveString(MyApp.getContext(), Constants.USERCODE, user.getUSER_CODE());
                            SharedPreferencesTool.saveString(MyApp.getContext(), Constants.USERNAME, user.getUSER_NAME());
                            SharedPreferencesTool.saveString(MyApp.getContext(), Constants.ID, user.getID());
                            Log.e("JSON", json);
                            enterHome();
                        }
                    }

                    @Override
                    public void onFailed(int what, Response<String> response) {
                        ToastUtils.show("登录失败");
                    }

                    @Override
                    public void onFinish(int what) {
                    }
                });
fenlyer 2017-06-20
  • 打赏
  • 举报
回复
HttpUtils.loginRequest(MD5Tool.md5(name), MD5Tool.md5(password), new OnResponseListener<String>() { @Override public void onStart(int what) { } @Override public void onSucceed(int what, Response<String> response) { //根据返回的数据进行判断,如果是判断出登录失败那么吐司,否则跳转 //"wrong".equal(response.getString()) if (false) { ToastUtils.show("用户名或者密码错误"); } else { String json = response.get(); User user = new Gson().fromJson(json, User.class); SharedPreferencesTool.saveString(MyApp.getContext(), Constants.ORGCODE, user.getORG_CODE()); SharedPreferencesTool.saveString(MyApp.getContext(), Constants.USERTYPE, user.getUSER_TYPE()); SharedPreferencesTool.saveString(MyApp.getContext(), Constants.USERCODE, user.getUSER_CODE()); SharedPreferencesTool.saveString(MyApp.getContext(), Constants.USERNAME, user.getUSER_NAME()); SharedPreferencesTool.saveString(MyApp.getContext(), Constants.ID, user.getID()); Log.e("JSON", json); enterHome(); } } @Override public void onFailed(int what, Response<String> response) { ToastUtils.show("登录失败"); } @Override public void onFinish(int what) { } });
清竹_ 2017-06-19
  • 打赏
  • 举报
回复
贴代码啊,LogActivity!
fenlyer 2017-06-19
  • 打赏
  • 举报
回复

80,348

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧