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의 이유에 대한 아이디어가 있습니까?
심각하게? 확실해 ? 나는 그것이 라이브러리 (예 : instagram, pinterest 등)를 사용하고있는 큰 프로젝트를 기반으로 충분히 안정적이라고 생각했다. – nima
과 base64 인코딩에 대해, 나는 그것이 복잡한 객체를 다루는 유일한 방법이라고 생각했다. 다양한 필드 (텍스트, 부울, 바이너리); 내가 한 일은 base64로 이진 필드를 인코딩하고 json으로 전체 데이터 구조를 표현하는 것이 었습니다. 다른 제안? – nima
일반적으로이 작업을 수행 할 때 링크를 사용하므로 개체를 정상적으로 보내고 이진 필드에 링크를 보내고 두 번째 요청에서는 파일을 다운로드합니다. – Leonardo