2015-01-11 3 views
0

loopj (최신 버전 : 1.4.6)를 사용하여 일부 큰 (5m +) 텍스트 데이터 (복잡한 json 인코딩 객체)를 다운로드하는 문제 (메모리 누수, 이 필드에는 base64로 인코딩 된 바이너리 데이터가 필드로 포함됩니다). 여기에 HttpAsyncResultTask 인터페이스는 잘 편집 주어진 작업큰 데이터를 다운로드하기 위해 loopj를 사용합니다.

에 따라 여러 구현이있을 수 있습니다,

public class AsyncResponseHandler extends TextHttpResponseHandler { 

    private final HttpAsyncResultTask asyncResultTask; 

    private final Logger logger = LoggerFactory.getLogger(AsyncResponseHandler.class); 

    public AsyncResponseHandler(final HttpAsyncResultTask asyncResultTask){ 
     super("utf-8"); // todo: ... 
     this.asyncResultTask = asyncResultTask; 
    } 


    @Override 
    public void onFailure(final int i, final Header[] headers, final String s, final Throwable throwable) { 
     logger.warn("got failure: i: " + i + " , s: " + s + " , t: " + throwable); 
     asyncResultTask.onFailure(); 
    } 

    @Override 
    public void onSuccess(final int i, final Header[] headers, final String s) { 
     logger.debug("got success: i: " + i + " , s: " + s); 
     asyncResultTask.onSuccess(s); 

    } 

    @Override 
    public void onSuccess(int statusCode, Header[] headers, byte[] responseBytes) { 
     super.onSuccess(statusCode, headers, responseBytes); 
    } 

    @Override 
    public void onFailure(int statusCode, Header[] headers, byte[] responseBytes, Throwable throwable) { 
     super.onFailure(statusCode, headers, responseBytes, throwable); 
    } 

} 

메모 데이터를 다운로드 할 TextHttpResponseHandler를 확장하는 기본 클래스, 난에 의해 접근 방식을 조금 변경 리소스의 더 작은 파일 청크들을 개별적으로 다운로드 (& 동시에); 그래서 이제는 리소스의 크기가 문제가되지 않습니다. 하지만 난 여전히 내 애플 리케이션에서 ANR지고 로그의 도움으로, 나는 꽤 응용 프로그램이 HTTP를 호출하려고 할 때 ANR 발생 확신 해요. 이러한 http 호출은 백그라운드 서비스 내에서 작성되며 loopj 문서에 따라 비동기 적이어야합니다. ANR의 이유에 대한 아이디어가 있습니까?

답변

0

문제는 lib입니다. Apache Http Client를 사용하여 모든 서버 데이터를 다운로드하고 버그가있는 경우 Android 팀에서 "대신 HttpURLConnection 사용"이라고 말합니다.

AsyncHttpClient 대신 OkHttpClient를 사용하는 것이 좋습니다.

하지만 텍스트 응답에서 base64 바이너리를 구문 분석하는 것은 좋지 않습니다.

+0

심각하게? 확실해 ? 나는 그것이 라이브러리 (예 : instagram, pinterest 등)를 사용하고있는 큰 프로젝트를 기반으로 충분히 안정적이라고 생각했다. – nima

+0

과 base64 인코딩에 대해, 나는 그것이 복잡한 객체를 다루는 유일한 방법이라고 생각했다. 다양한 필드 (텍스트, 부울, 바이너리); 내가 한 일은 base64로 이진 필드를 인코딩하고 json으로 전체 데이터 구조를 표현하는 것이 었습니다. 다른 제안? – nima

+0

일반적으로이 작업을 수행 할 때 링크를 사용하므로 개체를 정상적으로 보내고 이진 필드에 링크를 보내고 두 번째 요청에서는 파일을 다운로드합니다. – Leonardo