2017-10-18 5 views
1

Comment fermer response.body lorsque j'ai converti response.body() en classe POJO?Fermez response.body() en utilisant la classe POJO

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

Je lis sur la fermeture response.body après avoir utilisé ce code:

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

Mais je ne peux pas faire la même chose quand je suis en utilisant la classe POJO. Désolé, je suis toujours un débutant dans le développement d'applications Android.

Après ma course d'application pendant un certain temps, je suis arrivé dans ce Android Moniteur:

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

Pourquoi pensez-vous que vous devez le fermer? –

+0

@ cricket_007 Désolé, j'ai édité mon post pour mieux décrire mon problème. S'il vous plaît jeter un oeil si vous avez le temps. –

+0

Plz fournisseur le code qui crée le retrofit et okhttp, en particulier le 'Interceptor' personnalisé. – aLeX

Répondre

0

En fait, vous n'avez pas besoin de fermer responseBody si vous utilisez Retrofit. Le convertisseur l'a fait pour vous.

par exemple. si vous en utilisant JacksonConverterFactory, il y a classe nommée JacksonResponseBodyConverter, voir son code ci-dessous:

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

modifier: essayer de vérifier si la réponse est réussi à rappel onResponse, et appelez response.errorBody.close() si la réponse ne réussit pas

+0

Bonjour alxlx, désolé pour la gêne occasionnée. J'ai édité mon post pour une meilleure description de mon problème. S'il vous plaît jeter un oeil si vous avez le temps. –

0

Vous êtes en conflit avec les utilisations Okhttp et Retrofit. Ou en regardant les anciennes versions de ces bibliothèques. La rénovation 2 ferme le ResponseBody pour vous