2012-04-18 4 views
1

私はAsyncTaskをかなり使いましたが、私は混乱している一見単純な質問に出くわしました。問題は次のとおりです。AsyncTaskのpublishProgressメソッドは非同期ですか?

はすぐに を返しますか?言い換えれば、このメソッドは非同期ですか?

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

私は次のコード

    かかわらず、応答の
  • 火災HTTPリクエストごとに3秒、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 
} 

}

+0

ドキュメンテーションを読んでも邪魔にならない.... 'publishProgress ...このメソッドは、バックグラウンド計算がまだ実行されている間、ユーザーインターフェイスに進行状況を表示するために使用されます。例えば、プログレスバーをアニメーション化したり、テキストフィールドにログを表示したりするのに使うことができます。 ' – Selvin

+0

これを読んで理解したのは、進行中のものが公開されている間でも' doInBackground() 'が実行され続けることです。私はそれから何かを結論づけることはできませんでした。私は間違っているかもしれません - それで私はここでこの質問をしました。 – curioustechizen

+0

まだ、HttpResponseをonProgressUpdate(Progress ...)に送信することは意味がありません。なぜなら、あなたはUIスレッドでの応答処理を行い、これがANRに提供できるからです。UIコードと処理コードを分離する必要があります – Selvin

答えて

2
this.publishProgress(makeHttpRequest()); 

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

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

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

HttpResponseオブジェクトをpublishProgressに渡すとすぐに返されます。 progressオブジェクトは、非同期にUIスレッドのonProgressUpdate()に送信されます。

- >それはで、その後はの方法で眠ります。あなたはここでは2つの異なるものを求めている

+0

ああ - それはそれを説明します。私が考えていたことは何でしょう! – curioustechizen

4

  • publishProgress()は確かにそれはちょうどあなたのコードは、常にHTTPリクエストを実行する方法をpublishProgress()振る舞い、とは無関係のいくつかHandler
  • にメッセージをポストし、即座に返しません応答を待ってから3秒間スリープします。 publishProgress(makeHttpRequest())のようなメソッド呼び出しをインライン化しても、doInBackground()メソッドでは、makeHttpRequest()が呼び出された場所で実行されないという意味ではありません。
+0

すばらしい説明! @zaplは45秒でそれを打ち負かす:) – curioustechizen

+0

それはゲームの一部です:) –

関連する問題