2

以前、私は Android のデフォルトの HTTP クライアントを使用していましたが、このライブラリをhttp://loopj.com/android-async-http/で見つけました。

AsyncTask の doInBackground(String... args) 内でこのライブラリを使用すると、android-async-http が返される前に postExecute() が終了することに気付きました。

AsyncHttpClient を使用している場合、AsyncTask を使用しないでください。AsyncHttpClient のみを使用する場合、低速のインターネット接続またはインターネット アクセスでタイムアウトを処理する方法はありますか。

私はアンドロイドが初めてです、助けてください!

4

5 に答える 5

5

上記のライブラリが暗示しているように、メイン スレッドではなく、非同期でネットワーク呼び出しを行うことができます。そのため、実際には asynctask を使用してメイン スレッドのブロックを回避します。

したがって、上記のライブラリを使用している場合は、使用する必要はありAsynctaskませんNetworkConnectionOnMainThreadException。お役に立てれば。

于 2013-09-27T07:10:27.657 に答える
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 スレッドにはないと思います)。

于 2013-11-07T17:33:10.913 に答える
1

AsyncHttpClient を使用すると、次のようなステートメントでタイムアウトを簡単に処理できます。

client.setTimeout(5000)

利用可能なすべてのメソッドについては、ライブラリ ドキュメントを確認してください。

于 2013-10-10T03:15:41.277 に答える
0

まず、asynctask は同期実行であり、AsyncHttpClient は同時実行です。asynctask 内で client を使用しないでください。このように 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.       
 }
});
于 2015-09-09T07:50:05.893 に答える
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 に答える