Pregunta

Por ejemplo, estamos en SomeActivity y la actividad tiene un botón que invoca mover archivos de un directorio a otro (llamémoslo trabajo).

En BlackBerry yo haría:

  1. presione una ventana emergente no cancelable (pantalla de diálogo) que diga "Espere..."
  2. iniciar un hilo que cumpla con el trabajo
  3. Al finalizar el hilo, cierre la ventana emergente.

Este enfoque puede garantizar en un 99,99% que permanezcamos en la misma pantalla una vez finalizada la tarea, el usuario simplemente ve la ventana emergente y espera a que se complete el trabajo.La rotación del dispositivo o lo que sea no interrumpe el flujo de trabajo deseado.

En Android la cosa cambia.Sé que existe AsyncTask que probablemente se proporcione para resolver mi caso.Incluso hay una buena ejemplo de cómo se debe utilizar.Pero como no hay garantía de cuánto tiempo durará una instancia de actividad, AsyncTask debe cancelarse en onSaveInstanceState (y reiniciarse en onRestoreInstanceState).Esto significa que al usar AsyncTask no hay garantía de que podamos realizar completamente el trabajo una vez iniciado.En algunos casos, al enviar una solicitud de publicación http para crear un usuario, no me gustaría tener el problema "el usuario ya existe para este inicio de sesión" al volver a ejecutar AsyncTask.Esto es posible porque AsyncTask se puede interrumpir mientras la solicitud ya se ha enviado (y el servidor realmente está haciendo su trabajo: crear un nuevo usuario), pero AsyncTask se cancela antes de que recibamos la respuesta.

¿Existe alguna solución en Android para obtener el comportamiento similar al de BB indicado anteriormente?

¿Fue útil?

Solución 3

En mayo de 2010 Google emitió una nueva sesión IO llamado desarrollo de aplicaciones cliente Android REST nofollow que explica cómo lograr exactamente lo que pedí.

Resultó que la cuestión es más bien complicada, por lo que no existe una solución fácil y rápida. La solución requiere un conocimiento profundo de la plataforma Android / API. Este es el precio causado por la flexibilidad de los ciclos de vida del proceso / actividad de las aplicaciones.

Me siento cierta rareza en qué esta información no se presentó desde el primer versión de Android. Parece que Google sabía cómo escribir aplicaciones 100% Bugless y por alguna razón la comercialización no ha dado la aproximación. Imagínese cuántas aplicaciones con errores que estaba escrito en mayo de 2010.

De todos modos estoy contento de que ahora tengo algo bajo que llamamos enfoque de mejores prácticas.

Otros consejos

  

Pero ya que no hay garantía de cómo   durante mucho tiempo una instancia de actividad vivirá   la AsyncTask debe ser cancelada en   onSaveInstanceState (y reiniciar el   onRestoreInstanceState).

O tiene que ser gestionado por un Service.

Si su actividad se quiere quedar en la pantalla, sólo tiene que iniciar un hilo como este:

final File fromFile = ...;
final File toFile = ...;

new Thread() {
    @Override
    public void run() {
      // do something with fromFile, toFile
    }
}.start();

De esta manera la GUI-Thread está listo para hacer otra piensa como mostrar un

  android.app.ProgressDialog

Además, considerar la posibilidad del diálogo con inderogable

  ProgressDialog.setCancelable(false);

De esta forma el usuario sólo puede salir a través de la CASA-Key, que recibir una notificación cuando

  Activity.onPause()

se llama. Futhermore es posible que desee ver en Wakelocks, para detener la pantalla de giro negro y su aplicación empujado en el fondo donde podría ser matado. Se podría hacer esto en el hilo:

  PowerManager pm = (PowerManager) ivContext.getSystemService(Context.POWER_SERVICE);
  Wakelock wakeLock = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "MyApp");
  wakeLock.acquire();

  // ... copy stuff ...

  wakeLock.release();

Por supuesto que tendría que liberar el wakeLock, también, cuando el usuario sale a través de la CASA-Key.

Por último, si desea llamar GUI-Elementos de su fondo de rosca, esto sólo funciona si el hilo es parte de la GUI-Event-Loop, como el hilo normal es que se está ejecutando, al conseguir llamada con el ...- Métodos. Para lograr esto el fondo de rosca tendrá que devolver la llamada a la interfaz gráfica de hilo a través de un Handler. De esta manera:

  private Handler mHandler = new Handler() { 
      @Override
      public void handleMessage(Message msg) {
          Log.v(TAG, "Got Message "+msg.what); // prints: Got Message 77
      // ... do GUI actions ...
      }    
  };

  // ... in Thread ...

  int lvInfo = 77;
  mHandler.sendEmptyMessage(lvInfo);

Usted puede incluso poner objetos en el mensaje de esta manera:

  Message txtMsg = Message.obtain();
  textMsg.obj = "Hello World";
  mHandler.sendMessage(lvTextMsg);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top