2

早些時候,我用的是默認的HTTP的Android客戶端,然後發現這個庫在http://loopj.com/android-async-http/我應該在異步任務的dobackground中使用android-async-http客戶端嗎?

當我使用這個庫裏面的AsyncTask的doInBackground(字符串參數... args),我注意到,postExecute()Android系統的異步前完成-http返回。

如果我使用AsyncHttpClient,我不應該使用AsyncTask。如果我只使用AsyncHttpClient,有辦法處理緩慢的互聯網連接或互聯網訪問超時。

我是android新手,請大家幫忙!

回答

5

正如上面的庫所暗示的,您可以異步地進行網絡調用,即不在主線程中,這就是爲什麼我們實際上使用asynctask來避免阻塞主線程。

所以,如果你使用上面的庫,那麼沒有必要使用Asynctask,我相信你永遠不會得到NetworkConnectionOnMainThreadException。希望這可以幫助。

+0

問題是如何處理Asynctask和默認http客戶端的超時? –

+0

@Prateek謝謝,它幫助。我現在使用AsyncHttpClient而沒有asynctask。在我重寫庫的所有onFailure方法後,它運行良好。 – StarWars

+0

@StarWars很高興幫助。你可以接受這個答案,如果你想 – Prateek

1

隨着AsyncHttpClient,你可以很容易地通過這樣的語句處理超時:

client.setTimeout(5000) 

檢查所有可用的方法庫中的文檔。

+0

閱讀庫的文檔後,我想出了setTimeout方法。這個庫已經有默認的10秒超時,這是好的考慮我的應用程序是針對亞洲市場,但我不太確定。因爲它使用json api作爲後端,所以數據的大小並不是很大。如上所述,你推薦5秒超時嗎? – StarWars

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線程中)。

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.  
} 
}); 
0

使用異步HTTP客戶端只,只是以這種方式設置超時:

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 

希望這有助於

相關問題