AsyncTask的publishProgress方法是异步的吗?

时间:2012-04-18 12:36:55

标签: java android android-asynctask

我已经使用了AsyncTask了很多 - 但我遇到了一个让我感到困惑的看似简单的问题。问题是:

  

publishProgress(Progress... values)是否应该返回   立即?换句话说,这种方法是异步的吗?

某些上下文:

我正在尝试确定以下代码是否

  • 每三秒触发一次HTTP请求,无论响应如何
  • 触发HTTP请求,等待响应, 然后 在触发下一个请求之前休眠三秒钟。

公共类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
}

}

2 个答案:

答案 0 :(得分:4)

你在这里问两件事:

  • publishProgress()确实立即返回,它只是向某些Handler
  • 发布消息
  • publishProgress()的行为无关,您的代码将始终执行HTTP请求,等待响应,然后休眠三秒钟。仅仅调用方法调用publishProgress(makeHttpRequest())并不意味着makeHttpRequest()未在doInBackground()方法中调用它的位置执行。

答案 1 :(得分:2)

this.publishProgress(makeHttpRequest());

等于(Java无法传递方法。只是结果)

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

所以makeHttpReqest在后​​台完成。

您可以将HttpResponse对象传递给立即返回的publishProgress。然后,进度对象将异步发送到UI线程中的onProgressUpdate()

- >它是然后睡觉方式。