Ich verstehe, dass Netzwerkaufrufe und SQLite Zugriffe am besten durch Worker-Threads getan werden. In meinem Fall werden meine Netzwerkanrufe durch Okhttp erledigt und die SQLite wird durch einen einzelnen Arbeitsthread erledigt.Übersprungen 130 Frames, zu viel Arbeit auf dem Hauptthread
Also hier ist mein Problem. Ich habe eine Hauptaktivität, die alle Aktien enthält, die der Benutzer in einer Listenansicht gekauft hat. Jedes Mal, wenn diese neue Aktivität erstellt wird, durchläuft die Methode onCreate
die Bestände in der Datenbank und aktualisiert sie einzeln und aktualisiert dann die Listenansicht.
Dies belastet natürlich den Hauptfaden zu sehr. Aber mein Problem ist, wie kann ich das besser gestalten? Im Moment habe ich so etwas wie dies im onCreate
:
Thread t1 = new Thread(new Runnable{
@Override
public void run(){
// access sqlite
positionsArray = retrieveStocks();
}
});
t1.start();
t1.join(); //try catch omitted
Thread t2 = new Thread(new Runnable{
@Override
public void run(){
// use Okhttp to get data
positionsArray = refreshStocks();
}
});
t1.start();
t2.join(); //try catch omitted
adapter = new PositionsAdapter(this, positionsArray);
listview.setAdapter(adapter);
Das ist nicht das Problem weggehen nicht machen, weil der Haupt-Thread noch für t1
und t2
warten. Irgendwelche Designvorschläge, wie ich dieses Problem beheben kann?
Ihr auf create-Methode ein Text „Laden“ sollte zu tun, während Sie für die Threads warten – RMalke
Wie wäre es mit Loader zu vervollständigen? (Https://developer.android.com /reference/android/app/LoaderManager.html) Sie können zuerst den Ladetext (oder die zwischengespeicherten Daten) anzeigen und dann die Daten nach dem Laden aktualisieren. – chartsai
Ja, aber ich überspringe immer noch über 130 Frames, ich bekomme immer noch die Warnung, dass zu viel Arbeit am Hauptthread erledigt ist. –