必须从工作线程中调用方法publishProgress,当前推断的线程是主线程

时间:2019-07-15 08:39:20

标签: java android android-studio android-asynctask

我最近将一个完美的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();
}

原因是什么,为什么代码仍然可以正常运行?

IDE screenshot. Red squiggle underneath publishProgress method

1 个答案:

答案 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)