【问题标题】:Retrofit Response body close改造响应体关闭
【发布时间】:2017-05-26 20:39:37
【问题描述】:

我像下面的代码一样使用了改造。但是我找不到任何解决方案和官方文档来帮助我阻止泄漏并关闭响应机构。也许有人知道它应该是什么样子? 我的改造电话:

PlacesAPI.Factory.getInstance().getPlaces().enqueue(new Callback<Places>() {

                @Override
                public void onResponse(Call<Places> call, Response<Places> response) {
                    for (int i = 0; i < response.body().getPosts().size(); i++) {
                        if (response.body().getPosts().get(i).getNazwa().equals(shopName)) {
                            addMarker(Double.parseDouble(response.body().getPosts().get(i).getDlug()),
                                    Double.parseDouble(response.body().getPosts().get(i).getSzer()));
                        }
                    }
                                    }

                @Override
                public void onFailure(Call<Places> call, Throwable t) {

                }
            });

【问题讨论】:

  • 您不能多次致电response.body()
  • 在地图上添加所有标记后,我尝试清除响应。我在官方文档中读到总是 close() 应该完成。 android studio 也会向我抛出关于 logcat 的信息,我有泄漏并且没有在可以使用的地方使用 close()。之后我通过 Eclipse Mat 检查堆,我看到许多响应对象。
  • 响应对象应该只有一个,因为它是一个参数
  • 你在使用改造 2 吗?
  • 是的,改造 2

标签: android retrofit retrofit2


【解决方案1】:

重构你的代码。

反复抓取响应体效率不高

按顺序看下面的链接

响应正文只能使用一次

final List<Post> posts = response.body().getPosts();
for (Post p : posts) {
    if (p.getNazwa().equals(shopName)) {
        addMarker(Double.parseDouble(p.getDlug()), Double.parseDouble(p.getSzer()));
}

而且,根据文档,是的,必须关闭响应,所以使用 try 块来完成该操作

https://square.github.io/okhttp/3.x/okhttp/okhttp3/ResponseBody.html

【讨论】:

  • 以及如何在您的解决方案中使用关闭语句?
  • 也许它没有造成任何泄漏和 onDestroy 在这个活动上通过 GC 清除所有内容?
  • 欢迎您使用try-finally 块。 close方法存在于文档中,如果你想找到它
  • cricket_007 ...+1 你的名字
【解决方案2】:

这可能会有所帮助;

response.raw().body().close();

据此,改装2为你关闭身体

Retrofit Closing Response Body.

【讨论】:

    【解决方案3】:

    您是否尝试不在那里使用匿名类作为回调? 尝试创建一个类成员。

    private Callback<Places> mCallback = new Callback<Places>() {
    
                @Override
                public void onResponse(Call<Places> call, Response<Places> response) {
                    for (int i = 0; i < response.body().getPosts().size(); i++) {
                        if (response.body().getPosts().get(i).getNazwa().equals(shopName)) {
                            addMarker(Double.parseDouble(response.body().getPosts().get(i).getDlug()),
                                    Double.parseDouble(response.body().getPosts().get(i).getSzer()));
                        }
                    }
                                    }
    
                @Override
                public void onFailure(Call<Places> call, Throwable t) {
    
                }
            });
    PlacesAPI.Factory.getInstance().getPlaces().enqueue(mCallback);
    

    请尝试发表评论以通知我们所有人:)。

    【讨论】:

    猜你喜欢
    • 2017-01-21
    • 2018-11-04
    • 2016-02-18
    • 1970-01-01
    • 1970-01-01
    • 2017-01-15
    • 2020-09-12
    • 2023-03-14
    • 1970-01-01
    相关资源
    最近更新 更多