ejemplo - asynctask android example
Evento de fuego en AsyncTask finalizado (2)
Me gustaría agregar un evento disparado por el método de ejecución posterior de la clase AsyncTask. Luego, un oyente en la actividad de inicio de sesión se cerrará y la actividad principal estará visible.
onPostExecute()
ya es una devolución de llamada, puede crear otra devolución de llamada como la descrita pero no es necesaria. Simplemente pase una referencia de su Actividad de inicio de sesión a su AsyncTask y luego utilícela para llamar a finish()
y startActivity()
en onPostExecute()
.
Mi aplicación tiene una actividad de inicio de sesión y comprueba las credenciales a través de un sitio web de Internet. Para hacerlo, tengo que usar una clase AsyncTask. Cuando el inicio de sesión es exitoso, una variable global se establece en verdadero.
Como esto es asincrónico, la actividad no esperará el resultado, por lo que me gustaría agregar un evento que se active con el método de ejecución posterior de la clase AsyncTask. Luego, un listener
en la actividad de inicio de sesión se cerrará y la actividad principal estará visible.
Me gustaría saber si esto es posible y cómo. He intentado algunos ejemplos de otras publicaciones, pero no puedo entenderlo a partir de esos.
Creo que tengo que hacer lo siguiente: - crear una interface
en la clase AsyncTask
- del método post_execute
de esa clase, post_execute
el evento, pero ¿cómo? - poner un listener
en la actividad de inicio de sesión, pero ¿cómo?
cualquier ayuda es apreciada
Saludos, Eric
Al principio, crea tu clase de publicación, usando Asynctask o IntentService como siguiendo ...
public class PostIntentService extends IntentService implements PostTask.Observer {
private int counter = 0;
private int retry = 2;
private Data mData;
public PostIntentService() {
super("PostIntentService");
}
@Override
protected void onHandleIntent(Intent intent) {
mData = (Data) intent.getSerializableExtra("data");
// send updating status
Intent i = new Intent();
i.setAction(PostResponseReceiver.ACTION_RESPONSE);
i.addCategory(Intent.CATEGORY_DEFAULT);
i.putExtra("status", "updating");
sendBroadcast(i);
execute();
counter++;
}
@Override
public void onSuccessPost(String result) {
// send success status
Intent i = new Intent();
i.setAction(PostResponseReceiver.ACTION_RESPONSE);
i.addCategory(Intent.CATEGORY_DEFAULT);
i.putExtra("status", "success");
sendBroadcast(i);
}
@Override
public void onFailedPost(String result) {
if (counter < retry) {
execute();
counter++;
}
else {
// send failed status
Intent i = new Intent();
i.setAction(PostResponseReceiver.ACTION_RESPONSE);
i.addCategory(Intent.CATEGORY_DEFAULT);
i.putExtra("status", "failed");
i.putExtra("data", mData);// for reproduct
sendBroadcast(i);
}
}
private void execute() {
PostTask task = new PostTask(this);
task.execute();
}
}
En el segundo, cree su clase (BroadcastReceiver extendido) que recibe la intención cuando termina una publicación.
public class PostBroadcastReceiver extends BroadcastReceiver {
public static final String ACTION_RESPONSE = "com.example.android.intent.action.POST_PROCESSED";
private static final int POST_REQUEST = 100;
private Observer mObserver;
public PostBroadcastReceiver(Observer observer) {
mObserver = observer;
}
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getStringExtra("status").equals("updating")) {
}
else if (intent.getStringExtra("status").equals("success")) {
if (mObserver != null) {
mObserver.onPostFinished();
}
}
else if (intent.getStringExtra("status").equals("failed")) {
if (mObserver != null) {
mObserver.onPostFailed();
}
}
}
public interface Observer {
public void onPostFinished();
public void onPostFailed();
}
}
Registre este servicio en su archivo Manifest.
<service android:name=".PostIntentService" />
Registre este receptor en Crear su actividad principal.
IntentFilter filter = new IntentFilter(PostBroadcastReceiver.ACTION_RESPONSE);
filter.addCategory(Intent.CATEGORY_DEFAULT);
receiver = new PostResponseReceiver(this);
registerReceiver(receiver, filter);
E implemente el siguiente método en su actividad principal.
public void onPostFinished() {
Log.d("onPostFinished", "onPostFinished");
}
public void onPostFailed() {
Log.d("onPostFailed", "onPostFailed");
}
No olvides Anular el registro de este receptor en Destrucción de tu actividad principal.
unregisterReceiver(receiver);
Finalmente, ejecute la transferencia en su Actividad de inicio de sesión.
Intent intent = new Intent(this, PostIntentService.class);
intent.putExtra("data", mData);
startService(intent);