es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo definir una devolución de llamada para cuando se completa un AsyncTask

Tengo un fragmento de Android que solicita una página web utilizando AsyncTask y recupera el título de la página que debe mostrarse en un TextView. Invoco AsyncTask en onCreateView().

El problema es que hay un retraso notable antes de que AsyncTask se complete y se cree y muestre la vista del fragmento. No parece estar funcionando de forma asíncrona.

El código es el siguiente:

GetWebsiteAsyncTask getWebsiteAsyncTask = new GetWebsiteAsyncTask();
String websiteTitle = getWebsiteAsyncTask.execute().get();
websiteViewModel.setTitle(websiteTitle);

Con AsyncTask definido como:

class GetWebsiteAsyncTask extends AsyncTask<Void, Void, String> {

private static final String TAG = GetWebsiteAsyncTask.class.getName();

@Override
protected String doInBackground(Void... voids) {
    try {
        Document doc = Jsoup.connect("https://www.google.com").get();
        return doc.title();
    } catch (Exception e) {
        Log.e(TAG, Log.getStackTraceString(e));
    }
    return null;
}
}
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Es posible que el retraso sea causado por el método get() que está bloqueando el hilo principal. Para garantizar que AsyncTask se esté ejecutando de forma asíncrona, debes usar el método execute() en lugar de get():

    GetWebsiteAsyncTask getWebsiteAsyncTask = new GetWebsiteAsyncTask();
    getWebsiteAsyncTask.execute();
    

    Luego puedes usar el método onPostExecute() para actualizar websiteViewModel con el título:

    @Override
    protected void onPostExecute(String websiteTitle) {
        websiteViewModel.setTitle(websiteTitle);
    }
    

Comments are closed.