AsyncTask clase externa con ProgressDialog
** Actualizado: (Vea abajo) ** He estado buscando alrededor durante un par de días y no puedo encontrar una respuesta directa a esto. Algunos dicen que es posible que algunos dicen que para lograr algunos dicen que no lo es. Me estoy volviendo loco por esto.
Lo que quiero es que el AsyncTaskTask muestre una barra de progreso en una clase externa. Para hacer esto estoy pasando el contexto como se puede ver en la clase principal. Pero lo que intento consigo NullPointerException
.
- Android - progressdialog no se muestra en AsyncTask
- No se puede descartar ProgressDialog después de completar el AsyncTask
- Cómo establecer el tema para ProgressBar indeterminista en ProgressDialog en Android
- Android ProgressDialog no funcionará
- ¿Cómo expirar Asynctask y descartar ProgressDialog?
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: ¿Utilizando el código anterior, es posible devolver un valor del método onPostExecute a la clase principal, de alguna manera? (Lo siento por ser noobish beeing) 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 solucionar este problema? Gracias.
- ¿Cómo crear Progress Dialog en la aplicación Android?
- Agregar una barra de progreso en WebView
- ProgressDialog o ProgressBar ralentiza la aplicación que ejecuta Android 4.1
- Google Android de inicio de sesión está parpadeando un pequeño cuadro blanco vacío al iniciar sesión en un usuario
- Cómo mostrar un diálogo de progreso mientras se carga la página HTML en WebView
- Problema al mostrar ProgressDialog dentro de la actividad de la ficha anidada
- El diálogo de carga de la vista Web de Android no se ha descartado
- Cómo cambiar el tamaño de fuente de mensaje ProgressDialog en android mediante programación?
Estaba creando el 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(); } }
ok esto es lo que hice cuando estaba usando fragmentos. Así es como se llama a la AsyncTask dentro de un fragmento:
String result=new AsyncClass(getActivity()).execute();
y así es como se ve mi clase externa 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(); } }
@ Gracias SSZero gran respuesta, ayudó mucho.
Me gustaría responder a esta pregunta de seguimiento, es decir
Tengo una pregunta de seguimiento: ¿Utilizando el código anterior, es posible devolver un valor del método onPostExecute a la clase principal, de alguna manera? (Lo siento por ser noobish beeing) 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) { } }
- transición personalizada entre las actividades de android
- Eliminación de archivos de una carpeta – android