Question

Par exemple, nous sommes en SomeActivity et l'activité a un bouton qui invoque le déplacement des fichiers d'un répertoire à un autre (Appelons-emploi).

BlackBerry Je voudrais:

  1. pousser un popup non résiliable (écran de dialogue) dire "S'il vous plaît patienter ..."
  2. démarrer un thread qui répond à la tâche
  3. à la fin de fil fermer la fenêtre

Cette approche 99,99% peut garantir que nous restons sur le même écran une fois la tâche terminée, l'utilisateur ne voit que le menu contextuel et attend la fin du travail. rotation de l'appareil ou ce qui ne se cassent pas le flux de travail souhaitée.

Sur Android choses changent. Je sais qu'il ya le AsyncTask qui est probablement fourni pour résoudre mon cas. Il y a même un bon exemple de la façon dont il doit être utilisé. Mais comme il n'y a aucune garantie de la durée d'une instance d'activité va vivre la AsyncTask devrait être annulée sur onSaveInstanceState (et redémarré sur onRestoreInstanceState). Cela signifie l'utilisation AsyncTask il n'y a aucune garantie que nous sommes en mesure de remplir pleinement le travail une fois commencé. Dans certains cas, comme l'envoi d'une demande de poste http pour créer un utilisateur, je ne voudrais pas entrer dans « l'utilisateur existe déjà pour cette connexion » des problèmes sur le reruning AsyncTask. Ceci est possible car le AsyncTask peut être interrompue pendant que la demande est déjà envoyée (et le serveur est en train de faire son travail - la création d'un nouvel utilisateur)., Mais le AsyncTask est annulé avant que nous ayons la réponse

Y at-il une solution sur Android pour obtenir le comportement BB comme indiqué ci-dessus?

Était-ce utile?

La solution 3

En mai 2010 Google a publié une nouvelle session IO appelé développement d'applications client Android REST qui explique comment obtenir exactement ce que je demandais.

Il est avéré que la question est assez compliquée, donc il n'y a pas de solution facile et rapide. La solution exige une connaissance approfondie de la plate-forme / API Android. C'est le prix causé par la flexibilité du processus app / cycles de vie d'activité.

Je sens une certaine bizarrerie pourquoi cette information n'a pas été présenté à partir de la première version d'Android. On dirait que Google savait comment écrire des applications 100% bugless et pour une raison marketing ne partage pas l'approche. Imaginez combien d'applications voiturette a été écrit par mai 2010.

En tout cas je suis content maintenant je smth que nous appelons l'approche des meilleures pratiques.

Autres conseils

  

Mais comme il n'y a aucune garantie de la façon dont   longtemps une instance d'activité habitera   le AsyncTask devrait être annulé   onSaveInstanceState (et remis en marche sur   onRestoreInstanceState).

Ou ont-il géré par un Service.

Si votre activité veut rester sur l'écran, vous pouvez simplement commencer une discussion comme ceci:

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

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

De cette façon, l'interface utilisateur graphique-fil est prêt à faire autre pense comme l'affichage d'un

  android.app.ProgressDialog

En outre, envisager de faire la boîte de dialogue uncancellable avec

  ProgressDialog.setCancelable(false);

De cette façon, l'utilisateur ne peut sortir par le HOME-Key, que vous obtenez notifié de

  Activity.onPause()

est appelée. Futhermore vous voudrez peut-être regarder dans Wakelocks, pour arrêter l'écran noircissent et votre application poussé en arrière-plan où il pourrait être tué. Tu ferais cela dans le fil:

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

  // ... copy stuff ...

  wakeLock.release();

Bien sûr, vous auriez à libérer le wakeLock, aussi, lorsque l'utilisateur quitte via le. HOME-Key

Enfin, si vous voulez appeler GUI-éléments de votre fils de fond, cela ne fonctionnera que si le thread fait partie de l'interface graphique de l'événement en boucle, comme le fil normal est de vous en courant, lorsque appelé avec le ...- Méthodes. Pour ce faire votre arrière-plan-fil devra rappel à l'interface utilisateur graphique-fil via un gestionnaire. Comme ceci:

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

Vous pouvez même mettre des objets dans le message comme ceci:

  Message txtMsg = Message.obtain();
  textMsg.obj = "Hello World";
  mHandler.sendMessage(lvTextMsg);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top