简体   繁体   中英

Close response.body() by using POJO class

How to close response.body when I converted response.body() to POJO class?

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);
    }
}

I read about closing response.body after using this code:

ResponseBody body = response.body();
body.close();

But I can't do the same thing when I'm using POJO class. Sorry, I'm still a beginner in developing android application.

After my application run for some time, I got this in Android Monitor:

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

In fact you don't need to close ResponseBody if using Retrofit. The Converter did it for you.

eg if you using JacksonConverterFactory, there is class named JacksonResponseBodyConverter, see it's code below:

@Override public T convert(ResponseBody value) throws IOException {
    try {
      return adapter.readValue(value.charStream());
    } finally {
    value.close();
    }
}

edit: try checking if response is successful in onResponse callback, and call response.errorBody.close() if response is not successful

You are conflicting Okhttp and Retrofit uses. Or looking at old versions of those libraries.

Retrofit 2 closes the ResponseBody for you

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM