with studio onpostexecute example definicion create asynctask activity java android android-asynctask progressdialog

java - studio - Clase AsyncTask externa con ProgressDialog



asynctask with progressdialog android example (3)

Estabas creando ProgressDialog con un contexto nulo. El siguiente código funcionó para mí.

public class AsyncClass extends AsyncTask<Void, String, Void> { private Context context; ProgressDialog dialog; public AsyncClass(Context cxt) { context = cxt; dialog = new ProgressDialog(context); } @Override protected void onPreExecute() { dialog.setTitle("Please wait"); dialog.show(); } @Override protected Void doInBackground(Void... unused) { SystemClock.sleep(2000); return (null); } @Override protected void onPostExecute(Void unused) { dialog.dismiss(); } }

** Actualizado: (Ver a continuación) ** He estado buscando por un par de días y no puedo encontrar una respuesta directa a esto. Algunos dicen que es posible que algunos digan que algunos dicen que no. Me estoy volviendo loco con esto.

Lo que quiero es solo tener AsyncTaskTask mostrando una barra de progreso en una clase externa. Para hacer esto, paso el contexto como puedes ver en la clase principal. Pero cualquier cosa que intento, obtengo NullPointerException .

Se aprecian ejemplos de código de trabajo. Gracias

Usando Android 2.2 por cierto.

principal:

import android.app.Activity; import android.os.Bundle; public class AsyncDemo extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); new AsyncClass(this).execute(); } }

AsyncClass.java

import android.app.ProgressDialog; import android.content.Context; import android.os.AsyncTask; import android.os.SystemClock; public class AsyncClass extends AsyncTask<Void, String, Void> { private Context context; ProgressDialog dialog = new ProgressDialog(context); public AsyncClass(Context cxt) { context = cxt; } @Override protected void onPreExecute() { dialog.setTitle("Please wait"); dialog.show(); } @Override protected Void doInBackground(Void... unused) { SystemClock.sleep(2000); return (null); } @Override protected void onPostExecute(Void unused) { dialog.dismiss(); } }

Actualización: Tengo una pregunta de seguimiento: ¿Usando el código anterior, es posible devolver un valor del método onPostExecute a la clase principal, de alguna manera? (Lo siento por beeing noobish) He intentado algo como esto:

String result = new AsyncClass(this).execute();

y luego un método que devuelve una cadena. Pero no puedo hacer eso porque tengo:

Type mismatch: cannot convert from AsyncTask<String,Void,Void> to String

¿Qué puedo hacer para enfrentar este problema? Gracias.


Me gustaría responder a esa pregunta de seguimiento, es decir,

Tengo una pregunta de seguimiento: utilizando el código anterior, ¿es posible devolver un valor desde el método onPostExecute a la clase principal, de alguna manera? (Lo siento por beeing noobish) He intentado algo como esto:

String result = new AsyncClass(this).execute();

Hice esto en mi código funcionó.

AsyncClass ac=new AsyncClass(); ac.execute(""); String rslt=ac.get();

Llame a este código donde quiera.

public class AsynchClass extends AsyncTask <String,Integer,String> { public String result=null; @Override protected void onPreExecute() { // TODO Auto-generated method stub } protected String doInBackground(String... params) { // Do all your background task here return result; } @Override protected void onProgressUpdate(Integer... values) { } protected void onPostExecute(String result) { } }


ok esto es lo que hice ya que estaba usando fragmentos. Así es como llamas a AsyncTask dentro de un fragmento:

String result=new AsyncClass(getActivity()).execute();

y así es como se ve mi clase exterior AsyncTask:

public class AsyncClass extends AsyncTask<Void, Void, String> { ProgressDialog pdialog; public AsyncClass(Context context) { pdialog = new ProgressDialog(context); } @Override protected void onPreExecute() { pdialog.setIndeterminate(true); pdialog.setCancelable(false); pdialog.setTitle("Loading Feed.."); pdialog.setMessage("Please wait.");pdialog.show(); } @Override protected String doInBackground(Void... params) { String result=null; //do your task here and generate result String return result; } @Override protected void onPostExecute(String result) { if(pdialog.isShowing()) pdialog.dismiss(); } }

@ SSZero agradece una gran respuesta, ayudó mucho.