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();
}
}