我应该在Async任务的dobackground中使用android-async-http客户端吗?

时间:2013-09-27 07:04:45

标签: android android-asynctask connection-timeout android-async-http

之前我使用的是Android的默认Http客户端,然后在http://loopj.com/android-async-http/找到了这个库

当我在AsyncTask的doInBackground(String ... args)中使用这个库时,我注意到postExecute()在android-async-http返回之前完成。

如果我使用的是AsyncHttpClient,我是否应该使用AsyncTask。如果我只使用AsyncHttpClient,是否可以通过慢速互联网连接或互联网访问来处理超时。

我是android的新手,请帮忙!

4 个答案:

答案 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);
}

从活动或片段

中提供此请求的URL
RequestHandler 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.       
 }
});