2017-10-18 3 views
1

response.body()をPOJOクラスに変換したときに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); 
    } 
} 

私はこのコードを使用した後response.bodyを閉じる読ん:

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

しかし、私はPOJOクラスを使用していたとき、私は同じことを行うことはできません。 申し訳ありませんが、私はまだAndroidアプリケーションの開発の初心者です。

いくつかの時間のために自分のアプリケーションの実行の後、私はAndroidのモニタでこれを得た:実際には

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

なぜあなたはそれを閉じなければならないと思いますか? –

+0

@ cricket_007申し訳ありません、自分の問題をよりよく説明するために投稿を編集しました。時間があれば見てください。 –

+0

Plzプロバイダは、retrofitとokhttpを生成するコード、特にカスタムのInterceptorを生成します。 – aLeX

答えて

0

をレトロフィットを使用した場合は、ResponseBody閉じる必要はありません。コンバータはあなたのためにそれをやった。

あなたがJacksonConverterFactoryを使用している場合、JacksonResponseBodyConverterという名前のクラスがあり、それは以下のコードです参照してください。

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

編集: 応答がonResponseコールバックに成功したかどうかをチェックしてみてください、と応答が成功しなかった場合は()response.errorBody.closeを呼び出します

+0

こんにちはalxlx、ご迷惑をおかけして申し訳ありません。私は私の問題のより良い説明のために私のポストを編集しました。時間があれば見てください。 –

0

あなたはOkhttpとRetrofitの使用に矛盾しています。または、それらのライブラリの古いバージョンを見てください。

レトロフィット2がレスポンスボディを閉じます

関連する問題