2

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

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

如果我使用 AsyncHttpClient,我应该不使用 AsyncTask。如果我只使用 AsyncHttpClient,有没有办法处理慢速互联网连接或互联网访问超时。

我是android新手,请帮忙!

4

5 回答 5

5

正如上述库所暗示的,您可以异步进行网络调用,即不在主线程上,这就是我们实际上使用 asynctask 来避免阻塞主线程的原因。

所以,如果你正在使用上面的库,那么就没有必要使用Asynctask,我相信你永远不会得到NetworkConnectionOnMainThreadException。希望这可以帮助。

于 2013-09-27T07:10:27.657 回答
1

使用 AsyncHttpClient,您可以通过如下语句轻松处理超时:

client.setTimeout(5000)

检查库文档以获取所有可用的方法。

于 2013-10-10T03:15:41.277 回答
1

如果您使用此库,则不必为请求使用 AsyncTask 类。

在您的 Activity 代码中,您可以添加如下内容:

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 线程上)。

于 2013-11-07T17:33:10.913 回答
0

仅使用 async-http-client 并以这种方式设置超时:

AsyncHttpClient asyncHttpClient = new AsyncHttpClient();

public MyClassConstructor(){

    asyncHttpClient.setConnectTimeout(5000); // default is 10 seconds, minimum is 1 second
    asyncHttpClient.setResponseTimeout(5000); // as above
    asyncHttpClient.setTimeout(5000); // both connection and socket timeout
    asyncHttpClient.setMaxRetriesAndTimeout(1, 100); // times, delay

希望这可以帮助

于 2016-04-10T01:21:41.400 回答
0

首先 asynctask 是同步执行,AsyncHttpClient 是同时执行。不要在异步任务中使用客户端。像这样只使用 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);
}

从活动或片段中提供这样的请求网址

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.       
 }
});
于 2015-09-09T07:50:05.893 回答