我已经使用了AsyncTask
了很多 - 但我遇到了一个让我感到困惑的看似简单的问题。问题是:
publishProgress(Progress... values)
是否应该返回 立即?换句话说,这种方法是异步的吗?
我正在尝试确定以下代码是否
公共类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 :(得分: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()
。
- >它是然后睡觉方式。