Hace poco REIMPORTADAS un proyecto perfectamente bien Android en Android Studio y ha decidido unilateralmente a quejarse (y rojo bajo garabato) de código que es definitivamente seguro.
Me sale este garabato rojo en el IDE cada vez (pero sólo en postExecute
):
Método
publishProgress
debe ser llamado desde el subproceso de trabajo, hilo actualmente es inferido hilo principal
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();
}
¿Cuál es la causa y por qué el código ejecuta perfectamente bien de todos modos?
Este es un problema de formación de pelusas. A partir de la documentación publishProgress(Params...)
(mi negrita):
Este método se puede invocar desde
doInBackground(Params...)
a publicar actualizaciones sobre el hilo de interfaz de usuario , mientras que el cálculo de fondo aún se está ejecutando.
Por lo que este método está diseñado para ser llamado sólo en un subproceso de fondo, y esto se refleja en la fuente del método con la @WorkerThread
anotación:
@WorkerThread
protected final void publishProgress(Progress... values) {
if (!isCancelled()) {
getHandler().obtainMessage(MESSAGE_POST_PROGRESS,
new AsyncTaskResult<Progress>(this, values)).sendToTarget();
}
}
Así, mientras que doInBackground(String...)
se ejecuta en un subproceso en segundo plano, onPostExecute(String checkPhpResponse)
se ejecuta en el subproceso de interfaz de usuario como que está destinado a actualizar la interfaz de usuario directamente dentro de esa devolución de llamada. Debido a que publishProgress(Params...)
está anotado como @WorkerThread
, el IDE arroja un error a pesar de que el código se compilará - que funciona, pero es una mala práctica.
Sin ningún contexto aún más en cuanto a cómo su AsyncTask
se está utilizando no puedo aconsejarle sobre cómo actualizar el código, pero yo aconsejaría a evitar el uso publishProgress(boolean)
y en lugar de actualizar la interfaz de usuario directamente desde dentroonPostExecute(String)