2013-03-19 4 views
9

devo usare il v4 support lib per FragmentTabHostLe prestazioni di fragmenttabhost sono lente?

Il requisito è che quando sto scheda un passaggio a un altro & un altro, che chiama

onCreateView() & onActivityCreated() ogni volta.

Ecco perché le mie prestazioni del codice sono lente.

Quindi, altre soluzioni? come aumentare le prestazioni nella scheda dei frammenti?

+0

Potresti postare il tuo codice da 'onCreateView()' e 'onActivityCreated()'? – Darwind

+0

Hai provato setRetainInstance (true) nei tuoi frammenti? – Greensy

risposta

1

Ho trovato una soluzione per questo. Ho inserito tutti i websevices & codice di transazione del database al momento della creazione. perché oncreate non chiama ogni volta fino a quando l'ondestroy non chiama. & anche l'altra soluzione è disponibile, possiamo usare

fragment.show();

& fragment.hide(); metodo

+1

Sembra che tu abbia l'idea giusta. Tuttavia, l'obiettivo finale è che Fragments non debba parlare con la propria attività per recuperare i dati. Dovrebbero essere dati tutti i riferimenti alle risorse necessari per recuperare i loro dati da soli. Dopo tutto questo è il punto di Frammenti. Le attività sono semplicemente contenitori responsabili dell'inizializzazione e della navigazione. – dcow

+0

@saunik Sing: Puoi dire dove devo usare fragment.show() e fragment.hide(). Devo sovrascrivere la funzione onTabChanged ?? –

9

Sembra un odore di design.

Ridisegnare il codice in modo che il lavoro pesante venga eseguito in modo asincrono. I frammenti dovrebbero essere in grado di essere costruiti rapidamente. Se è necessario eseguire un'elaborazione di grandi dimensioni affinché un frammento visualizzi informazioni utili, tale lavoro deve essere eseguito in anticipo o in modo asincrono dopo la creazione del frammento e il frammento deve essere avvisato di aggiornare il suo contenuto quando il lavoro è completo .

+3

concordato. Se "onCreateView()" o "onActivityCreated()" richiedono più di un paio di millisecondi, lo stai facendo male. – CommonsWare

+1

in effetti la causa esatta! –

1

La prima cosa di cui bisogna fare attenzione è osservare i calcoli/caricare un grande set di dati dovrebbe essere posto su un thread di lavoro diverso rispetto al thread principale dell'interfaccia utente. L'opzione migliore per farlo (secondo me) è usare AsyncTask. È possibile utilizzare qualcosa di simile nel tuo Frammento:

private class LoadData extends AsyncTask<Void, Void, Void>{ 

     @Override 
     protected void onPreExecute(){ 
      super.onPreExecute(); 
      // this is the place where you can show 
      // progressbar for example to indicate the user 
      // that there is something which is happening/loading in the background 
     } 

     @Override 
     protected void doInBackground(Void... params){ 

      // that's the place where you should do 
      // 'the heavy' process which should run on background thread 
     } 

     @Override 
     protected void onPostExecute(Void result){ 
      super.onPostExecute(); 
      // you should update your UI here. 
      // For example set your listview's adapter 
      // changes button states, set text to textview and etc. 
     } 
} 

Questo è il modo è possibile rendere le schede funzionano faster.Hope questo vi aiuterà! :)

0

In aggiunta allo sviluppatore Android: se usi già AsyncTask, ricorda che anche quando usi più AsyncTask, vengono eseguiti in background, ma tutti in sequenza! Se vuoi più discussioni per gestire le tue attività, controlla questo post, che spiega perfettamente come ottenerlo! Running multiple AsyncTasks at the same time -- not possible?

+1

Dipende dalla versione in esecuzione e dall'hardware del dispositivo. Le attività asincrone vengono eseguite su un pool di thread in cui il caso semplice è un pool di 1 thread di lavoro. Questo è anche il valore predefinito per alcune versioni del framework. – dcow