with programacion example asynctask activity android android-asynctask accountmanager

android - programacion - progress dialog in activity



¿Cómo llamar a la función de actividad principal desde ASyncTask? (2)

setAccountAuthenticatorResult puede llamar a setAccountAuthenticatorResult desde la Actividad, que extiende AccountAuthenticatorActivity . Mi actividad extiende eso, pero inicia ASyncTask y, por lo setAccountAuthenticatorResult debe llamar a este setAccountAuthenticatorResult desde ASyncTask (o, el resultado de ASyncTask debe devolverse al hilo principal).

¿Cómo hacerlo?

¿Qué está mal en el código de abajo?

AsyncTask<Uri, Void, Bundle> task = new RetrieveAccessTokenTask(this, consumer, provider, prefs).execute(uri); public class RetrieveAccessTokenTask extends AsyncTask<Uri, Void, Bundle> { private Context context; public RetrieveAccessTokenTask(Context context, OAuthConsumer consumer, OAuthProvider provider, SharedPreferences prefs) { this.context = context; } @Override protected void onPostExecute(Bundle result) { context.setAccountAuthenticatorResult(); // doesn''t work }


Utilizar interfaz

Sigue estos pasos:

1) Crear una interfaz

public interface AsyncTaskListener{ public void updateResult(String result); }

2) Usa el oyente en tu AsyncTask

DownloadSongTask extends AsyncTask<String,Integer,String>{ private AsyncTaskListener listener; public DownloadSongTask(Context context) { listener= (AsyncTaskListener)context; // Typecast } @Override public void doInbackGround(String... params) { // Download code int downloadPerc = // calculate that publish(downloadPerc); } @Override public void onPostExecute(String result) { listener.updateResult(String result); // Use it } }

3) Implementar la interfaz en el método de Actividad y Anulación

public class YourActivity extends AppcompatActivity implements AsyncTaskListener{ // Activity code // new DownloadSongTask(this).execute("Paradise.mp3"); // this is how you start Task public void yourMethod(String arg) { // Your method related Stuff } @Override public void updateResult(String result){ yourMethod(result); } }

¿Ventaja de usar interfaz?

Esto parece un enfoque largo al principio pero usando este enfoque

Puede hacer que su AsyncTask sea independiente de cualquier Actividad que utilice la Interfaz. Si desea usar la misma AsyncTask con diferentes Actividades, entonces el enfoque de interfaz es el mejor, ya que su AsyncTask puede usarse con cualquier Actividad sin siquiera cambiar el código en la AsyncTask. Así es como creas una AsyncTask holgadamente acoplada.

Enlaces relevantes:

Para una mejor comprensión puedes leer esta ANSWER


Al crear la AsyncTask, puede agregarle un nuevo constructor y pasar una referencia a la Actividad:

AsyncTask myTask = new MyTask(this);

Y luego, desde el método onPostExecute () en AsyncTask, puede llamar al método en la Actividad.

public class MyTask extends AsyncTask<String, String, String> { public MyActivity activity; public MyTask(MyActivity a) { this.activity = a; } // ...... protected void onPostExecute(String result) { activity.myMethod(); } }