Я занимаюсь проблемами (утечка памяти, ui freeze, ...) с помощью loopj (последняя версия: 1.4.6), чтобы загрузить некоторые большие текстовые данные (5 м +) (сложные json-кодированные объекты которые содержат двоичные данные с кодировкой base64 как одно из своих полей). вот базовый класс, который расширяет TextHttpResponseHandler для загрузки данныхusing 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);
}
}
к сведению, что интерфейс HttpAsyncResultTask может иметь несколько реализаций на основе данной задачи
Edited хорошо, я изменил подход немного по загрузка меньших фрагментов файла ресурса отдельно (& одновременно); так что теперь размер ресурса не является проблемой. но я все еще получаю ANR в своем приложении и с помощью журналов, я уверен, что ANR происходит, когда приложение пытается сделать http-звонки. эти http-вызовы создаются в фоновом режиме, и согласно документации loopj, она должна быть асинхронной. какие-либо идеи по причине ANR?
серьезно? вы уверены ? Я думал, что он достаточно стабилен (на основе больших проектов, которые используют библиотеку, например, instagram, pinterest и т. Д.) – nima
и о кодировке base64, я думал, что это единственный способ, когда вы имеете дело со сложным объектом, который имеет различные поля (текстовые, логические, двоичные); то, что я сделал, было кодирование двоичных полей с base64 и представление всей структуры данных с помощью json; любые другие предложения? – nima
Обычно, когда я это делаю, я работаю со ссылками, поэтому отправляю объект нормально, а в двоичном поле мы отправляем ссылку, а по второму запросу загружаем файл. – Leonardo