0

サードパーティのWebサイトから情報をダウンロードするAsyncTaskがあります。このウェブサイトは私の管理下にありません。

問題は、この情報を2秒以内に取得することもありますが、最大30〜40秒かかることもあります。

Webブラウザのデスクトップでも同じ問題が発生するため、問題はWebサイト自体にあることを知っています。

私が探しているのは、一定の時間がかかる場合に操作をキャンセルして再試行する方法です。

これが私の現在のコードです:

protected ArrayList<Card> doInBackground(Void... voids)
{
    Looper.prepare();
    publishProgress("Preparing");
    SomeClass someClass = new SomeClass(this);

    return someClass.downloadInformation();
}
4

1 に答える 1

1

Httpリクエストのタイムアウトとソケット接続を設定してみてください。次のリンクが表示されます:JavaでAndroidのHttpResponseタイムアウトを 設定して、それらを設定する方法を確認してください。

また、HttpRequestRetryHandlerを使用して、カスタム例外回復メカニズムを有効にします。

http://hc.apache.orgから: "デフォルトでは、HttpClientはI / O例外から自動的に回復しようとします。デフォルトの自動回復メカニズムは、安全であることがわかっているいくつかの例外に制限されています。

  • HttpClientは、論理エラーまたはHTTPプロトコルエラー(HttpExceptionクラスから派生したエラー)からの回復を試みません。
  • HttpClientは、べき等であると見なされるメソッドを自動的に再試行します。
  • HttpClientは、HTTPリクエストがターゲットサーバーに送信されている間(つまり、リクエストがサーバーに完全に送信されていない場合)に、トランスポート例外で失敗したメソッドを自動的に再試行します。」

例:

DefaultHttpClient httpclient = new DefaultHttpClient();

HttpRequestRetryHandler myRetryHandler = new HttpRequestRetryHandler() {

public boolean retryRequest(
        IOException exception, 
        int executionCount,
        HttpContext context) {
    if (executionCount >= 5) {
        // Do not retry if over max retry count
        return false;
    }
    if (exception instanceof InterruptedIOException) {
        // Timeout
        return false;
    }
    if (exception instanceof UnknownHostException) {
        // Unknown host
        return false;
    }

    if (exception instanceof SocketTimeoutException) {
        //return true to retry 
        return true;
    }

    if (exception instanceof ConnectException) {
        // Connection refused
        return false;
    }
    if (exception instanceof SSLException) {
        // SSL handshake exception
        return false;
    }
    HttpRequest request = (HttpRequest) context.getAttribute(
            ExecutionContext.HTTP_REQUEST);
    boolean idempotent = !(request instanceof HttpEntityEnclosingRequest); 
    if (idempotent) {
        // Retry if the request is considered idempotent 
        return true;
    }
    return false;
}

};

httpclient.setHttpRequestRetryHandler(myRetryHandler);

詳細については、次のリンクを参照してください: http ://hc.apache.org/httpcomponents-client-ga/tutorial/html/fundamentals.html#d4e292 。

于 2013-01-05T14:32:32.797 に答える