2015-12-14 3 views

risposta

12

Dalla documentazione Android:

Tuttavia, un frammento non è richiesto di essere una parte del layout attività; puoi anche usare un frammento senza la sua interfaccia utente come lavoratore invisibile per l'attività.

Come su questo scopo?

semplice esempio: un Activity avvia un AsyncTask, ma quando il dispositivo ruotato activity riavvio, causando AsyncTask a perdere il collegamento con il thread dell'interfaccia utente. Ma questo Activity può contenere un Fragment (invisibile, senza interfaccia utente) in grado di gestire tutto il lavoro AsyncTask. Quando Activity viene ricreato, il sistema operativo Android si occupa di ricollegare lo Fragment, pertanto non si verificherà alcuna perdita di dati.

+0

non sono gestori, asynctask e servizi sono casertari che lo scopo? O c'è una situazione, quando il frammento come lavoratore è migliore di qualsiasi altro. È difficile per me capirlo, dato che il frammento viene eseguito nella filettatura principale – Yarh

+0

Hai chiesto e risposto alla tua stessa domanda nello stesso commento :) ("come frammento viene eseguito nella discussione principale") –

+0

I ment, potrebbe esserci esempio che utilizza il ciclo di vita dei frammenti con combinazione di asynctask o 'Thread'. Ma non sembra che tale frammento abbia mai messo in pausa e riprendere le chiamate – Yarh

2

Come menziona @Lucius Hipan, può essere utilizzato per prevenire la perdita di dati. Quasi sempre questo re dei frammenti viene utilizzato come contenitore mantenuto (setRetainInstance (true) chiamato nel metodo onCreate), quindi dopo il cambio della configurazione del dispositivo (ad esempio la modifica dell'orientamento) il frammento non verrà ricreato ma si ricorderà dello stato precedente. È consigliato utilizzare asynctask.

Ecco un esempio:

C'è attività di accesso. L'utente inserisce le proprie credenziali e preme il pulsante Accedi. Dopo che si verifica la modifica della configurazione (l'utente ruota il telefono). Quindi, l'attività di rete è stata completata, ma i gestori non lo stavano ascoltando ora. Se mostri un'animazione di login, può essere memorizzata tramite savedInstance, ma gli ascoltatori no. E invece di creare un servizio puoi semplicemente creare un nuovo frammento mantenuto con asynctask persistente e interfaccia per comunicare con l'attività.

Questo metodo è un buon compromesso per piccoli progetti in cui l'utilizzo di librerie di bus è esagerato.

1

Chiamando il metodo add(Fragment fragment, String tag) chiama internamente add(int containerId, Fragment fragment, String tag) con un containerId.That 0 sarà add(0, fragment, tag). Se 0 viene fornito come containerId, non verrà inserito il frammento in contenitore.

+0

È lo stesso, ho scritto in questione, non è vero? – Yarh

2

È possibile utilizzare frammenti senza UI (contenitore) come background worker (un vantaggio è che è possibile mantenerlo durante le rotazioni, ecc.) E per conservare i dati durante le rotazioni e altre modifiche.

La lettura http://developer.android.com/guide/components/fragments.html è fortemente consigliata.

Esempio di esempio trattenere: https://android.googlesource.com/platform/development/+/master/samples/ApiDemos/src/com/example/android/apis/app/FragmentRetainInstance.java

Qui ci sono domande simili (quindi questa domanda sembra essere un duplicato, ma non possono essere fermati a causa di taglie):