2017-10-18 6 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 클래스를 사용하고 때 나는 같은 일을 할 수 없습니다. 죄송합니다, 저는 아직 안드로이드 응용 프로그램을 개발하는 초보자입니다.

얼마 동안 내 응용 프로그램 실행 후, 나는 안드로이드 모니터에이있어 :

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

왜 닫아야한다고 생각하십니까? –

+0

@ cricket_007 죄송합니다. 내 문제를 더 잘 설명하기 위해 내 게시물을 편집했습니다. 시간이 있으면보십시오. –

+0

Plz 제공 업체는 개조 및 okhttp를 생성하는 코드, 특히 사용자 지정 'Interceptor'를 생성합니다. – aLeX

답변

0

사실 당신이 개조를 사용하는 경우위한 responseBody을 닫을 필요가 없습니다. 변환기가 당신을 위해 해냈습니다.

응답이 성공하지 못한 경우 응답이 onResponse 콜백에 성공하면 확인 시도하고 response.errorBody.close()를 호출 :

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

편집 : 당신이 JacksonConverterFactory를 사용하는 경우, 클래스 이름 JacksonResponseBodyConverter이, 그 아래 코드의 참조

+0

안녕하세요 alxlx, 불편을 끼쳐 드려 죄송합니다. 내 문제에 대한 더 나은 설명을 위해 내 게시물을 편집했습니다. 시간이 있으면보십시오. –

0

Okhttp 및 Retrofit 사용이 충돌합니다. 또는 해당 라이브러리의 이전 버전을 살펴보십시오.

개조 후 2 개가 ResponseBody를 닫습니다.