之前我使用的是Android的默认Http客户端,然后在http://loopj.com/android-async-http/找到了这个库
当我在AsyncTask的doInBackground(String ... args)中使用这个库时,我注意到postExecute()在android-async-http返回之前完成。
如果我使用的是AsyncHttpClient,我是否应该使用AsyncTask。如果我只使用AsyncHttpClient,是否可以通过慢速互联网连接或互联网访问来处理超时。
我是android的新手,请帮忙!
答案 0 :(得分:5)
正如上面的库所暗示的,你可以异步进行网络调用,即不在主线程上,这就是为什么我们实际上使用asynctask来避免阻塞主线程。
因此,如果您使用上述库,则无需使用Asynctask
,我相信您永远不会获得NetworkConnectionOnMainThreadException
。希望这会有所帮助。
答案 1 :(得分:1)
使用AsyncHttpClient,您可以通过以下语句轻松处理超时:
client.setTimeout(5000)
检查库文档以获取所有可用方法。
答案 2 :(得分:1)
如果您使用此库,则不必使用AsyncTask类进行请求。
在您的活动代码中,您可以输入以下内容:
AsyncHttpClient client = new AsyncHttpClient();
client.get("http://www.google.com", new AsyncHttpResponseHandler() {
@Override
public void onSuccess(String response) {
System.out.println(response);
}
});
这将在后台线程中自动发送请求。在onSuccess中你可以处理响应(类似于onPostExecute,但我猜它不在UI线程上)。
答案 3 :(得分:0)
首先,asynctask是一个同步执行,而AsyncHttpClient是一个同步执行。不要在asynctask内部使用客户端。像这样只使用AsyncHttpclient。创建公共请求处理程序和侦听器。您还可以为所需的每个请求创建不同的请求方法,如makeRequest,还可以创建不同的侦听器。
public class RequestHandler{
private static RequestHandler instance;
private AsyncHttpClient client;
private RequestHandler(){
client = new AsyncHttpClient();
}
public static RequestHandler getInstance(){
if(instance == null){
instance = new RequestHandler();
}
return instance;
}
// You can add more parameters if you need here.
public void makeRequest(String url, RequestListener listener){
client.get(url, new AsyncHttpResponseHandler() {
@Override
public void onStart() {
// called before request is started
//Some debugging code here
}
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] response) {
listener.onSuccess(statusCode, headers, response);
}
@Override
public void onFailure(int statusCode, Header[] headers, byte[] errorResponse, Throwable exception) {
listener.onFailure(statusCode, headers, errorResponse,exception);
// called when response HTTP status is "4XX" (eg. 401, 403, 404)
//Some debugging code here, show retry dialog, feedback etc.
}
@Override
public void onRetry(int retryNo) {
//Some debugging code here-------
}
});
}
}
public interface RequestListener{
public void onSuccess(int statusCode, Header[] headers, byte[] response);
public void onFailure(int statusCode, Header[] headers, byte errorResponse, Throwable e);
}
从活动或片段
中提供此请求的URLRequestHandler handler = RequestHandler.getInstance();
handler.makeRequest("http://www.google.com", new RequestListener(){
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] response) {
// do whatever you want here.
}
});