Android AsyncTask en clase externa
He estado trabajando en una aplicación y he conseguido que el AsyncTask
funcione bien cuando se encuentra en una clase interna.
Ahora, estoy refactorizando el código para que el AsyncTask
esté en una clase separada propia, pero me pregunto, ¿cómo puedo matar el ProgressDialog
y comenzar una nueva actividad una vez que la tarea se ha completado correctamente? He intentado iniciar una nueva actividad en el onPostExecute(..)
, pero sé que no funcionará.
- Actualizar la interfaz de usuario de Android desde un subproceso de otra clase
- Mapas android carga asincrónica de elementos de superposición
- Async tarea dentro de los fragmentos durante la pantalla oreintation
- Pantalla de presentación en pantalla blanca en blanco al realizar AsyncTask
- Cuando desarrollo una aplicación para Android, ¿cómo puedo cancelar una AsyncTask en ejecución?
Pasar mi actividad de hilo de interfaz de usuario como un argumento en el constructor de AsyncTask no parecía funcionar:
//In UI Thread I had public class Test101 extends Activity { private Button btnLogin; private LoginTask mLoginTask; private Context context=this; private Test101 mTest101; mLoginTask=new LoginTask(context,mTest101); mLoginTask.execute(null); // In the AsyncTask I had Activity mParentActivity; public LoginTask(Context context,Activity act){ this.ctx=context; this.mParentActivity=act; } onPostExecute(..){ mParentActivity.callSomeMethod(); } ... }
Seguí recibiendo una NullPointerException
, tal vez estoy perdiendo algo pero eso no funcionó para mí.
- ¿Cómo utilizar SQLite DB de AsyncTask?
- ¿Saber cuándo una vista en un ListView ha salido de la pantalla?
- Devolver un valor de AsyncTask en Android
- Cola sin bloqueo de solicitudes HTTP POST con persistencia
- ¿Cómo puedo hacer conexiones de URL asíncronas en Android?
- ¿Cuál es la forma correcta de implementar AsyncTask? Estática o no estática clase anidada?
- Android - Llamadas de red asíncronas - Respuesta dependiente entre sí
- AsyncHttpRequest POST no activar devoluciones de llamada (android-async-http por loopj)
En lugar de pasar 2 parámetros pasar sólo uno como este:
public class Test101 extends Activity { private Button btnLogin; private LoginTask mLoginTask; mLoginTask=new LoginTask(this); mLoginTask.execute(); //Instead of sending null put the 1st parameter of the AsyncTask as Void
AsyncTask Código:
Activity mParentActivity; public LoginTask(Activity act){ this = act; } onPostExecute(..){ ((Test101)mParentActivity).callSomeMethod(); }
Todo lo que necesita para iniciar una nueva Actividad es el objeto de contexto que pasa en el constructor de la AsyncTask
:
private Context ctx; private ProgressDialog pDialog; private String r=""; public LoginTask(Context context){ super(); this.ctx=context; } @Override protected void onPostExecute(String result) { Log.i("LOGGER", "Done..."); pDialog.dismiss(); Intent i=new Intent(ctx,SillyActivity.class); ctx.startActivity(i); }
Si pasa la actividad dentro del constructor en AsyncTask
y trata de llamar a startActivity(Intent intent)
siempre obtendrá una excepción de puntero nulo.
step 1 : create your master class and declare mNetworkMaster.runForgetAsync(); step 2: write another class for AsyncTask package com.example.xxx; import java.util.HashMap; import java.util.Map; import android.app.Activity; import android.os.AsyncTask; public class NetworkMaster { Activity mMasterActivity; LoadingDialog objLoadingDialog; Map<String, String> serverUrls = new HashMap<String,String>(); // create a constructor public NetworkMaster(Activity mMasterActivity){ this.mMasterActivity = mMasterActivity; }// end constr NetworkMaster // Method to run the Async task public void runForgetAsync(){ new ForgetPasswordAsync().execute(); }// end runForgetAsync // dynamically call the thread public class ForgetPasswordAsync extends AsyncTask<String, String, String> { @Override protected void onPreExecute(){ super.onPreExecute(); } protected String doInBackground(String... urls) { serverUrls = Ipsum.getServerUrls(); int response = HttpRequest.post().send("name=xxxx").code(); return ""+response; } protected void onPostExecute(String result) { // return the result to master activity ((Login)mMasterActivity).ForgetPassword(result); } }// end ForgetPasswordAsync }// end NetworkMaster
Pasar la actividad como un parámetro constructor a su AsyncTask y mantenerlo en un campo. Esto es efectivamente lo que ser una clase interna estaba recibiendo (sólo el compilador escribiría el código para usted).
Utilice Android Annotations for AsyncTask fácil, rápido, simple!
MTest101 no se inicia. Es sólo nulo … Así que usted puede ver sólo la excepción puntero nulo y eso es lo normal. O puede hacer que el método estático funcione bien sin iniciar la clase.
- Error de persistencia de disco Firebase: las modificaciones a objetos Config deben ocurrir antes de que estén en uso
- Cómo recuperar la rotación de miniaturas