1

我已经使用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
}

}

4

2 回答 2

4

你在这里问两个不同的事情:

  • publishProgress()确实会立即返回,它只是向某些人发布消息Handler
  • 与行为方式无关publishProgress(),您的代码将始终执行 HTTP 请求,等待响应,然后休眠三秒钟。只是内联方法调用publishProgress(makeHttpRequest())并不意味着它 makeHttpRequest()没有在你的doInBackground()方法中被调用的地方执行。
于 2012-04-18T12:47:03.363 回答
2
this.publishProgress(makeHttpRequest());

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

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

makeHttpReqest在后台也是如此。

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

-> 这是然后睡觉的方式。

于 2012-04-18T12:45:52.763 回答