1

私はAsyncTaskかなり使ってきましたが、私を混乱させる一見単純な質問に出くわしました。質問はこれです:

publishProgress(Progress... values)すぐに戻ることになっていますか?つまり、このメソッドは非同期ですか?

いくつかのコンテキスト:

次のコードかどうかを判断しようとしています

  • 応答に関係なく、3 秒ごとに HTTP 要求を起動するOR
  • HTTP 要求を発行し、応答を待ってから次の要求を発行する前に 3 秒間スリープします。

パブリック クラス MyAsyncTask {

@Override
protected void doInBackground(String... params) {
    while (mRunning) {
        // Call publishProgress
        this.publishProgress(makeHttpRequest());

        // Sleep for 3 seconds
        synchronized (lock) {
            try {
                lock.wait(3 * 1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    return null;
}

private HttpResponse makeHttpRequest() {
    HttpResponse ajaxResponse = null;
    Throwable throwable = null;
    try {
        ajaxResponse = mHttpClient.execute(mHttpGet);
    } catch (ClientProtocolException e) {
        // Handle exception
    } catch (IOException e) {
        // Handle exception
    } catch (Exception e) {
        // Handle exception
    }

    return ajaxResponse;

}

@Override
protected void onProgressUpdate(HttpResponse... values) {
    // Do something with the response
}

}

4

2 に答える 2

4

ここでは、2つの異なることを求めています。

  • publishProgress()確かに即座に戻ります、それはただいくつかにメッセージを投稿しますHandler
  • 動作とは関係なくpublishProgress()、コードは常にHTTPリクエストを実行し、レスポンスを待ってから3秒間スリープします。のようにメソッド呼び出しをインライン化するだけでは、メソッド内で呼び出された場所で正しく実行されpublishProgress(makeHttpRequest())ないという意味で はありません。makeHttpRequest()doInBackground()
于 2012-04-18T12:47:03.363 に答える
2
this.publishProgress(makeHttpRequest());

等しい (Java はメソッドを渡すことができません。結果のみ)

HttpResponse resp = makeHttpRequest();
this.publishProgess(resp);

makeHttpReqestバックグラウンドで行われます。

すぐに戻るHttpResponseオブジェクトを渡すよりも。publishProgressその後、progress オブジェクトはonProgressUpdate()UI スレッドで非同期に送信されます。

-> それはその後の眠り方です。

于 2012-04-18T12:45:52.763 に答える