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á.


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í.

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.

  • AndroId MediaPlayer método prepareAsync
  • La llamada a API no funciona dentro de Anko Async
  • Cómo utilizar AsyncTask en Servicios en Android?
  • Loopj Android Async Http - onFailure no disparado
  • ¿Cómo utilizar ExecutorService con Android AsyncTask?
  • Biblioteca de clientes API de REST para Android
  • ¿Cómo esperar múltiples llamadas asincrales anidadas usando RxJava-Android?
  • IOS / Objective-C equivalente de Android AsyncTask
  • Android: descargar archivo grande
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.