我最近将一个完美的android项目重新导入到Android Studio中,它已单方面决定抱怨(绝对是安全的)红色代码。
我每次都在IDE中得到这个红色的花体(但仅在postExecute
中):
方法
publishProgress
必须从工作线程中调用,当前推断的线程是主线程
private void triggerClick() {
final class LoginHttpTask
extends
AsyncTask<String/* Param */, Boolean /* Progress */, String /* Result */> {
@Override
protected String doInBackground(String... params) {
publishProgress(true);
}
@Override
protected void onPostExecute(String checkPhpResponse) {
publishProgress(false);
}
}
new LoginHttpTask.execute();
}
原因是什么,为什么代码仍然可以正常运行?
答案 0 :(得分:1)
这是一个问题。来自publishProgress(Params...)
的文档(我的粗体):
可以在后台计算仍在运行时从
doInBackground(Params...)
调用此方法,以在UI线程上发布更新。
因此,此方法设计为仅在后台线程上调用,这在方法的in the source中带有@WorkerThread
批注:
@WorkerThread
protected final void publishProgress(Progress... values) {
if (!isCancelled()) {
getHandler().obtainMessage(MESSAGE_POST_PROGRESS,
new AsyncTaskResult<Progress>(this, values)).sendToTarget();
}
}
因此,doInBackground(String...)
在后台线程上运行时,onPostExecute(String checkPhpResponse)
在UI线程上运行,因为您打算直接在该回调中更新UI。因为publishProgress(Params...)
被注释为@WorkerThread
,所以即使代码可以编译,IDE也会引发错误-它可以工作,但这是不正确的做法。
没有关于如何使用AsyncTask
的进一步说明,我不建议如何更新代码,但是我建议避免使用publishProgress(boolean)
而是直接更新UI来自onPostExecute(String)