Domanda

Per esempio, siamo in SomeActivity e l'attività dispone di un pulsante che richiama spostare file da una dir a un altro (chiamiamolo lavoro).

Su BlackBerry vorrei:

  1. spingere un non annullabile popup (finestra di Dialogo) che dice "attendere Prego..."
  2. avviare un thread che compie il lavoro
  3. sul thread di completamento chiudere il popup

Questo approccio al 99,99% in grado di garantire che dobbiamo stare sullo stesso schermo dopo l'operazione è finita, l'utente vede solo il popup e di attesa per il completamento del processo.La rotazione del dispositivo o qualunque cosa non rompere il flusso di lavoro desiderato.

Su Android le cose cambiano.So che c'è il AsyncTask che probabilmente è fornito per risolvere il mio caso.C'è anche una buona esempio di come dovrebbe essere usato.Ma poiché non vi è alcuna garanzia di durata di una istanza di Attività per vivere in AsyncTask dovrebbe essere annullato onSaveInstanceState (e riavviato in onRestoreInstanceState).Questo significa che utilizzando AsyncTask non c'è alcuna garanzia siamo in grado di svolgere pienamente il processo una volta avviato.In alcuni casi, come l'invio di una richiesta http post per la creazione di un utente non vorrei entrare in "utente già esistente per l'accesso" problemi reruning AsyncTask.Questo è possibile in quanto l'AsyncTask può essere interrotta mentre la richiesta è già stata inviata (e il server in realtà sta facendo il suo lavoro - la creazione di un nuovo utente), ma AsyncTask è annullato, prima abbiamo avuto la risposta.

C'è qualche soluzione su Android per ottenere il BB comportamento sopra indicato?

È stato utile?

Soluzione 3

Nel Maggio 2010 Google ha rilasciato un nuovo IO sessione chiamata Di sviluppo di Android, il RESTO delle applicazioni client il che spiega come ottenere esattamente quello che ho chiesto.

Si è scoperto la questione è piuttosto complicata, quindi non c'è soluzione più semplice e veloce.La soluzione richiede una profonda conoscenza della piattaforma Android/API.Questo è il prezzo che ha causato la flessibilità dell'applicazione del processo/Attività del ciclo di vita.

Mi sento alcune curiosità sul perché questa informazione non è stata presentata la prima versione di Android.Sembra come Google sapeva scrivere 100% bugless apps e per un po ' di marketing la ragione non condividere l'approccio.Provate a immaginare quante buggy app è stata scritta da Maggio 2010.

Comunque sono contento che ora ho qualcosa che noi chiamiamo le best practice.

Altri suggerimenti

Ma poiché non c'è alcuna garanzia di quanto lungo un'Attività istanza di vivere AsyncTask deve essere annullato onSaveInstanceState (e riavviato onRestoreInstanceState).

O di essere gestito da un Service.

Se la vostra Attività vuole rimanere sullo schermo, si può semplicemente avviare un Thread come questo:

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

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

In che modo il GUI-Thread è pronto a fare altri la pensa come la visualizzazione di un

  android.app.ProgressDialog

Inoltre, è bene che il Dialogo con uncancellable

  ProgressDialog.setCancelable(false);

Che modo l'utente può lasciare solo tramite HOME-Chiave, che si ricevere una notifica quando

  Activity.onPause()

viene chiamato.Inoltre si potrebbe desiderare di guardare in Wakelocks, per interrompere la Schermata di attivazione nero e l'applicazione spinto in background in cui potrebbe essere ucciso.Ti piacerebbe fare questo nel Thread:

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

  // ... copy stuff ...

  wakeLock.release();

Naturalmente, è necessario rilasciare il wakeLock, anche quando l'utente lascia via di CASA a Chiave.

Infine, se si desidera chiamare GUI-Elementi dal tuo background-thread, questo funziona solo se il Thread è parte della GUI, Event-Loop, come un normale Thread è in esecuzione, quando sempre chiamato con a...-Metodi.Per raggiungere questo sfondo thread dovrà richiamata la GUI-Thread tramite un Gestore.Come questa:

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

Si può anche mettere gli oggetti nel messaggio in questo modo:

  Message txtMsg = Message.obtain();
  textMsg.obj = "Hello World";
  mHandler.sendMessage(lvTextMsg);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top