Frage

Zum Beispiel sind wir in SomeActivity und die Aktivität hat eine Schaltfläche, dass Invokes Dateien von einem Verzeichnis zum anderen (nennen wir es Job).

Auf Blackberry würde ich:

  1. drücken, um einen unkündbaren Popup (Dialog-Bildschirm) sagen: "Bitte warten ..."
  2. starten einen Thread, der den Job
  3. erfüllt
  4. auf Thread Abschluss schließen Sie das Popup

Dieser Ansatz 99,99% garantieren, dass wir auf dem gleichen Bildschirm bleiben, nachdem die Aufgabe beendet ist, der Benutzer sieht nur das Popup und wartet auf Job abgeschlossen wurde. Gerätedrehung oder was auch immer nicht den gewünschten Workflow brechen.

Auf Android Dinge ändern. Ich weiß, dass es die AsyncTask, die wahrscheinlich zur Verfügung gestellt wird, meinen Fall zu lösen. Es gibt sogar eine gute Beispiel , wie es verwendet werden soll. Aber da gibt es keine Garantie dafür, wie lange eine Aktivität Instanz die AsyncTask leben sollte auf onSaveInstanceState storniert werden (und neu gestartet auf onRestoreInstanceState). Dieses Mittel mit AsyncTask gibt es keine Garantie wir in der Lage sind, in vollem Umfang den Auftrag zu erfüllen einmal gestartet. In einigen Fällen als eine HTTP-Post-Anforderung zu senden, um einen Benutzer zu schaffen würde ich nicht in bekommen „bereits Benutzer existieren für diese Login“ Ärger auf die AsyncTask reruning. Dies ist möglich, da die AsyncTask unterbrochen werden kann, während die Anforderung bereits gesendet wird (und der Server tatsächlich seine Arbeit tut - einen neuen Benutzer erstellen)., Aber die AsyncTask abgebrochen wird, bevor wir die Antwort bekam

Gibt es eine Lösung auf Android die BB-ähnliches Verhalten oben angegeben zu bekommen?

War es hilfreich?

Lösung 3

Im Mai 2010 Google gab eine neue IO-Sitzung namens entwickeln von Android REST-Client-Anwendungen was erklärt, wie genau zu erreichen, was ich gefragt.

Es stellte sich die Frage heraus ist ziemlich kompliziert, so dass es nicht einfach ist und schnelle Lösung. Die Lösung erfordert tiefe Kenntnis der Android-Plattform / API. Dies ist der Preis durch die Flexibilität der Anwendung Prozess / Aktivität Lifecycles verursacht.

ich einige Kuriosität fühlen, warum diese Informationen nicht von der ersten Version von Android vorgestellt. Sieht aus wie Google wusste, wie 100% bugless Anwendungen zu schreiben und aus irgendeinem Grund Marketing den Ansatz nicht teilen. Man stelle sich vor, wie viele Buggy-Apps wurde von Mai 2010 geschrieben.

Auf jeden Fall bin ich froh, jetzt habe ich smth wir Best-Practice-Ansatz nennen.

Andere Tipps

  

Aber da gibt es keine Garantie dafür, wie   lange wird eine Aktivitätsinstanz leben   die AsyncTask sollte abgebrochen werden, auf   onSaveInstanceState (und neu gestartet auf   onRestoreInstanceState).

oder lassen Sie es von einem Service verwaltet werden.

Wenn Ihre Aktivität will auf dem Bildschirm bleiben, können Sie einfach einen Thread starten wie folgt aus:

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

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

Auf diese Weise des GUI-Thread ist bereit, andere zu tun, denkt wie die Anzeige ein

  android.app.ProgressDialog

Bedenken Sie auch den Dialog unkündbaren machen mit

  ProgressDialog.setCancelable(false);

Auf diese Weise kann der Benutzer nur über die HOME-Taste verlassen, die Sie benachrichtigen, wann

  Activity.onPause()

aufgerufen wird. Futhermore möchten Sie vielleicht in Wakelocks suchen, wird der Bildschirm vom Drehen schwarz und Ihre Anwendung in den Hintergrund gedrängt zu stoppen, wo sie getötet werden könnten. Sie würden dies tun im Thema:

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

  // ... copy stuff ...

  wakeLock.release();

Natürlich würden Sie die WakeLock loslassen müssen, auch wenn die Benutzer Blätter über die HOME-Taste.

Schließlich, wenn Sie GUI-Elemente aus dem Hintergrund-Thread, dies funktioniert nur, wenn der Thread ist Teil des GUI-Ereignis-Loop, wie das normale Thema nennen wollen ist, dass Sie laufen in, wenn du mit genannt Einsteigen ...- Methoden. Um dies zu erreichen Ihr Hintergrund-Thread muß den GUI-Thread über einen Handler zurückrufen. Wie folgt aus:

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

Sie können auch Objekte in der Nachricht setzen in etwa so:

  Message txtMsg = Message.obtain();
  textMsg.obj = "Hello World";
  mHandler.sendMessage(lvTextMsg);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top