2013-03-19 5 views
9

ich habe das v4 support lib für FragmentTabHostFragmenttabhost Leistung ist langsam?

Voraussetzung ist, dass, wenn ich Registerkarte einen zum anderen & ein anderes Schale bin, dass

onCreateView() & onActivityCreated() jedes Mal anruft.

Deshalb ist meine Code-Leistung langsam.

Also, irgendwelche anderen Lösungen? Wie kann ich die Performance in der Fragment-Registerkarte erhöhen?

+0

Könnten Sie Ihren Code von 'onCreateView()' und 'onActivityCreated()'? – Darwind

+0

Haben Sie in Ihren Fragmenten setRetainInstance (true) ausprobiert? – Greensy

Antwort

1

Ich fand eine Lösung dafür. Ich habe alle Webservices & Datenbank Transaktionscode in create eingefügt. weil oncreate nicht jedes Mal aufrufen, bis die Ondestroy nicht anrufen. & die andere Lösung ist auch verfügbar können wir verwenden

fragment.show();

& fragment.hide(); Methode

+1

Klingt, als hättest du die richtige Idee. Das ultimative Ziel ist jedoch, dass Fragmente nicht mit ihren Aktivitäten kommunizieren müssen, um Daten abzurufen. Sie sollten alle erforderlichen Ressourcenreferenzen erhalten, um ihre Daten selbst zu holen. Nach all dem liegt der Sinn von Fragments. Aktivitäten sind lediglich Container, die für die Initialisierung und Navigation zuständig sind. – dcow

+0

@saunik Sing: Kannst du bitte sagen, wo ich fragment.show() und fragment.hide() verwenden muss. Muss ich onTabChanged Funktion überschreiben? –

9

Klingt wie ein Design-Geruch.

Redesign Ihres Codes, so dass schwere Arbeit asynchron ausgeführt wird. Fragmente sollten schnell gebaut werden können. Wenn eine große Verarbeitung durchgeführt werden muss, damit ein Fragment nützliche Informationen anzeigen kann, sollte diese Arbeit im Voraus oder asynchron nach der Erstellung des Fragments ausgeführt werden und das Fragment sollte benachrichtigt werden, um seinen Inhalt zu aktualisieren, wenn die Arbeit abgeschlossen ist .

+3

Einverstanden. Wenn 'onCreateView()' oder 'onActivityCreated()' mehr als ein paar Millisekunden benötigen, machen Sie es falsch. – CommonsWare

+1

in der Tat die genaue Ursache! –

1

Das erste, worauf Sie achten sollten, ist das Überwachen von Berechnungen. Das Laden großer Datenmengen sollte in einem anderen Worker-Thread als dem Haupt-UI-Thread erfolgen. Die beste Option, dies zu tun (meiner Meinung nach) ist AsyncTask. Sie können so etwas in Ihrem Fragment verwenden:

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. 
     } 
} 

Dies ist die Art und Weise Sie Ihre Tabs arbeiten faster.Hope machen dies wird Ihnen helfen! :)

0

Als Ergänzung zu Android-Developer: Wenn Sie bereits AsyncTask verwenden, denken Sie daran, dass auch wenn Sie mehrere AsyncTask verwenden, diese im Hintergrund ausgeführt werden, aber alle nacheinander! Wenn Sie mehr Threads für Ihre Aufgaben benötigen, lesen Sie diesen Beitrag, in dem Ihnen erklärt wird, wie Sie dies erreichen können! Running multiple AsyncTasks at the same time -- not possible?

+1

Dies hängt davon ab, auf welcher Version Sie ausgeführt werden, und von der Hardware des Geräts. Async-Tasks werden in einem Pool von Threads ausgeführt, in dem der einfache Fall ein Pool von 1 Arbeitsthread ist. Dies ist auch der Standard für einige Versionen des Frameworks. – dcow