Autore Topic: adapter in AsyncTask in caso di fragment retained  (Letto 458 volte)

Offline ratal

  • Nuovo arrivato
  • *
  • Post: 11
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus 5
  • Sistema operativo:
    kitkat
adapter in AsyncTask in caso di fragment retained
« il: 15 Agosto 2014, 15:03:12 CEST »
0
Ciao ragazzi,
nei giorni scorsi mi sono studiato tutto il concetto dei fragment retained e del come far si che si salvi l'instanza di essi anche in caso di cambio configurazioni (es. rotazione schermo).
Sono riuscito quindi, tramite varie guide, a far si che un fragment collegato ad un asynctask mantenga il processo in corso a prescindere dalla distruzione dell'activty principale. C'è però un punto che ho risolto alla "vecchia" ma vorrei correggerlo, non credo sia la tecnica ottimale:
Nel mio AsyncTask devo fare alcune chiamate al db, per fare queste chiamate inizializzo un adapter. Gli adapter hanno bisogno del contesto attivo per essere inizializzati, cosa che può esserci o meno nel caso l'activity del fragment sia in fase di "ricreazione". Per risolvere ho inserito un while che resta "in attesa" di un getActivity() valorizzato sul mio fragment, ma non credo sia la pratica migliore...qualche suggerimento? grazie mille

Codice: [Seleziona]
@Override
        protected Boolean doInBackground(Object... params) {
                try {
                        // faccio il while in attesa di avere un Context valido per il fragment
                        while (topFragment.getActivity() == null) {

                        }
                        DbAdapter dbAdapter = new DbAdapter(topFragment.getActivity()
                                        .getApplicationContext());
                        dbAdapter.open();
                        String urlServer = dbAdapter.GetConfigurazione(
                                        Constants.PROPERTY_URLSERVER, "");
                        boolean usaSsl = Boolean.valueOf(dbAdapter.GetConfigurazione(
                                        Constants.PROPERTY_USA_SSL, String.valueOf(true)));
                        String username = dbAdapter.GetConfigurazione(
                                        Constants.PROPERTY_USERNAME, "");
                        dbAdapter.close();

//[.....]

                } catch (Exception e) {
                        e.printStackTrace();
                }

                return null;
        }

Offline tonno16

  • Utente storico
  • *****
  • Post: 1231
  • Respect: +60
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:adapter in AsyncTask in caso di fragment retained
« Risposta #1 il: 15 Agosto 2014, 15:28:54 CEST »
0
Non so se dico una cavolata. Avevo anche io lo stesso problema. Avevo un AsynkTask e una sola activity. Cosi se giravo lo schermo ripartiva il thread.
Ho risolto con onConfigurationCgange() e inoltre ho settato un attributo nell' Activity del manifest.

Siccome il fragment di per se non è niente....ma come sappiamo sta dentro ad un activity. Mi vene da pensare che se te giri lo schermo, il fragment "se ne accorge" e lo comunica all' activity padre.  Allora se non sbaglio è qui che devi intervenire, nell' Activity padre.

Sto dicendo cavolate ??

Offline ratal

  • Nuovo arrivato
  • *
  • Post: 11
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus 5
  • Sistema operativo:
    kitkat
Re:adapter in AsyncTask in caso di fragment retained
« Risposta #2 il: 15 Agosto 2014, 20:13:59 CEST »
0
Io, seguendo le linee di google, ho preferito gestire il tutto con i fragment retain. C'erano altre scappatoie tipo la tua, o addirittura (ben più radicale) l'evitare che l'activity roteasse :)
Ho cercato di seguire la soluzione forse più rognosa ma comunque consigliata da google ed è tutto ok.
L'unico problema appunto è che dall'asynctask non riesco ad avere un Context costante, dato che varia tra un destory dell'activity e l'altro.
Mi chiedevo quale fosse la soluzione per inizializzare questi adapter senza contare sul Context e su quell'orribile while che ho dovuto inserire...

iClaude

  • Visitatore
Re:adapter in AsyncTask in caso di fragment retained
« Risposta #3 il: 16 Agosto 2014, 14:12:49 CEST »
0
Credo che la soluzione migliore sia gestire le operazioni in background tramite un Service, all'interno del quale far partire un thread separato tramite ad esempio un AsyncTask.
Questo perchè i Service non sono condizionati dal normale ciclo di vita delle Activity/Fragment, per cui in genere non ci si trova di fronte a questo genere di problemi che obbligano ad adottare soluzioni macchinose e confusionarie.

Offline tonno16

  • Utente storico
  • *****
  • Post: 1231
  • Respect: +60
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:adapter in AsyncTask in caso di fragment retained
« Risposta #4 il: 16 Agosto 2014, 14:14:32 CEST »
0
Non si ha il rischio di un attesa iniziale troppo elevata?

iClaude

  • Visitatore
Re:adapter in AsyncTask in caso di fragment retained
« Risposta #5 il: 16 Agosto 2014, 14:35:39 CEST »
0
Non si ha il rischio di un attesa iniziale troppo elevata?

Non direi, per quanto ho avuto modo di vedere l'avvio di un Service è praticamente istantaneo.

Offline ratal

  • Nuovo arrivato
  • *
  • Post: 11
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus 5
  • Sistema operativo:
    kitkat
Re:adapter in AsyncTask in caso di fragment retained
« Risposta #6 il: 17 Agosto 2014, 20:45:29 CEST »
0
Grazie mille proverò con il service  ;-)