使用loopj下载大数据

时间:2015-01-11 06:47:30

标签: android json memory-leaks android-async-http loopj

我使用loopj(最新版本:1.4.6)处理问题(内存泄漏,ui冻结......)下载一些大型(5m +)文本数据(包含base64-的复杂json编码对象)编码二进制数据作为其中一个字段)。这里是扩展TextHttpResponseHandler以下载数据的基类

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接口可能有多个基于给定任务的实现

被修改 好吧,我通过单独下载资源的较小文件块(并且同时)来稍微改变了方法;所以,现在资源的大小不是问题。但我仍然在我的应用程序中获得ANR,并且在日志的帮助下,我非常确定当应用程序尝试进​​行http调用时会发生ANR。这些http调用是在后台服务中创建的,根据loopj文档,它应该是异步的。关于ANR原因的任何想法?

1 个答案:

答案 0 :(得分:0)

这里的问题是lib,它使用Apache Http Client下载所有服务器数据,并且它有bug,Android团队说"使用HttpURLConnection而不是#34;。

我建议您使用OkHttpClient而不是AsyncHttpClient。

但是对文本响应解析base64二进制文件并不是一个好的想法。