我使用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原因的任何想法?
答案 0 :(得分:0)
这里的问题是lib,它使用Apache Http Client下载所有服务器数据,并且它有bug,Android团队说"使用HttpURLConnection而不是#34;。
我建议您使用OkHttpClient而不是AsyncHttpClient。
但是对文本响应解析base64二进制文件并不是一个好的想法。