2015-01-11 6 views
0

Я занимаюсь проблемами (утечка памяти, 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?

ответ

0

Проблема здесь в lib, она использует Apache Http Client для загрузки всех данных сервера, и у нее есть ошибки, команда Android говорит: «Вместо этого используйте HttpURLConnection».

Я рекомендую использовать OkHttpClient вместо AsyncHttpClient.

Но проанализируйте двоичный код base64 на текстовом ответе, это не очень хорошо.

+0

серьезно? вы уверены ? Я думал, что он достаточно стабилен (на основе больших проектов, которые используют библиотеку, например, instagram, pinterest и т. Д.) – nima

+0

и о кодировке base64, я думал, что это единственный способ, когда вы имеете дело со сложным объектом, который имеет различные поля (текстовые, логические, двоичные); то, что я сделал, было кодирование двоичных полей с base64 и представление всей структуры данных с помощью json; любые другие предложения? – nima

+0

Обычно, когда я это делаю, я работаю со ссылками, поэтому отправляю объект нормально, а в двоичном поле мы отправляем ссылку, а по второму запросу загружаем файл. – Leonardo