Java 使用POJO类关闭response.body()

Java 使用POJO类关闭response.body(),java,android,retrofit2,okhttp,Java,Android,Retrofit2,Okhttp,当我将response.body()转换为POJO类时,如何关闭response.body public class RetrofitClient { private static Retrofit retrofit = null; private final static OkHttpClient okHttpClient = new OkHttpClient.Builder() .readTimeout(10, TimeUnit.SECONDS)

当我将response.body()转换为POJO类时,如何关闭response.body

public class RetrofitClient {
   private static Retrofit retrofit = null;
   private final static OkHttpClient okHttpClient = new OkHttpClient.Builder()
        .readTimeout(10, TimeUnit.SECONDS)
        .writeTimeout(10, TimeUnit.SECONDS)
        .connectTimeout(10, TimeUnit.SECONDS)
        .build();

   private final static Gson gson = new GsonBuilder().setLenient().create();

   public static Retrofit getClient(String baseUrl) {
     if (retrofit == null){
         retrofit = new Retrofit.Builder()
                .baseUrl(baseUrl)
                .client(okHttpClient)
                .addConverterFactory(GsonConverterFactory.create(gson))
                .build();
     }
     return retrofit;
   }}

public static class GroupMembersCallback implements Callback<GroupAdminPreview>{
    private List<String> usersUsername = new ArrayList<>();
    private List<String> usersFullName = new ArrayList<>();
    private List<String> usersIsAdmin = new ArrayList<>();
    private GroupMembersAdapter membersAdapter;
    private WeakReference<RecyclerView> mRecyclerView;
    private WeakReference<Context> contextWeakReference;

    public GroupMembersCallback(WeakReference<RecyclerView> mRecyclerView, WeakReference<Context> context){
        this.mRecyclerView = mRecyclerView;
        contextWeakReference = context;
    }

    @Override
    public void onResponse(Call<GroupAdminPreview> call, Response<GroupAdminPreview> response) {
        GroupAdminPreview groupAdminPreview = response.body();

        for (GroupAdminPreview.GroupUser groupUser : groupAdminPreview.getGroupUsers()){
            usersUsername.add(groupUser.getUserName());
            usersFullName.add(groupUser.getFirstName() + " " + groupUser.getLastName());
            usersIsAdmin.add(groupUser.getIsAdmin());
        }
        membersAdapter = new GroupMembersAdapter(usersUsername, usersFullName, usersIsAdmin, contextWeakReference, mRecyclerView);
        mRecyclerView.get().setAdapter(membersAdapter);
    }
    @Override
    public void onFailure(Call<GroupAdminPreview> call, Throwable t) {
        System.out.println(t);
    }
}
但是当我使用POJO类时,我不能做同样的事情。 对不起,我还是开发android应用程序的初学者

在我的应用程序运行一段时间后,我在Android Monitor中得到了以下信息:

A connection to ....... was leaked. Did you forget to close a response body?

事实上,如果使用改装,您不需要关闭ResponseBody。转换器为你做的

e、 g.如果您使用JacksonConverterFactory,则有一个名为JacksonResponseBodyConverter的类,请参见下面的代码:

@Override public T convert(ResponseBody value) throws IOException {
    try {
      return adapter.readValue(value.charStream());
    } finally {
    value.close();
    }
}
编辑:
尝试在onResponse回调中检查响应是否成功,如果响应不成功,则调用response.errorBody.close()

事实上,如果使用改型,则不需要关闭ResponseBody。转换器为你做的

e、 g.如果您使用JacksonConverterFactory,则有一个名为JacksonResponseBodyConverter的类,请参见下面的代码:

@Override public T convert(ResponseBody value) throws IOException {
    try {
      return adapter.readValue(value.charStream());
    } finally {
    value.close();
    }
}
编辑:
请尝试在onResponse回调中检查响应是否成功,如果响应不成功,请调用response.errorBody.close()

您正在冲突Okhttp和改型使用。或者看看那些库的旧版本


改装2为您关闭响应库

您正在使用HTTP和改装冲突。或者看看那些库的旧版本


改装2为您关闭响应库

为什么您认为需要关闭它?@cricket\u 007对不起,我编辑了我的帖子,以便更好地描述我的问题。如果你有时间,请看一看。Plz提供了创建改型和okhttp的代码,特别是自定义的
拦截器
@alxlx好的,我编辑了我的帖子。我没有在我的代码中使用自定义的
拦截器
。@WilzzNic,我已经更新了我的答案,检查它是否能解决你的问题……你为什么认为你需要关闭它?@cricket\u 007对不起,我编辑了我的帖子,以便更好地描述我的问题。如果你有时间,请看一看。Plz提供了创建改型和okhttp的代码,特别是自定义的
拦截器
@alxlx好的,我编辑了我的帖子。我没有在我的代码中使用自定义的
拦截器
。@WilzzNic,我已经更新了我的答案,请检查它是否能解决您的问题……您好,alxlx,很抱歉给您带来不便。为了更好地描述我的问题,我编辑了我的帖子。如果有时间,请看一看。你好,alxlx,很抱歉给您带来不便。为了更好地描述我的问题,我编辑了我的帖子。如果你有时间,请看一看。