2016-07-14 23 views
0

Ich erstelle eine Android App, wo ich einige Ziele in einer SQLite-Datenbank speichern. Auch ich hole diesen Inhalt von der on-line mysql Datenbank, wenn es neuen Inhalt gibt.Übersprungene Bilder bei der Verwendung von Async

Wenn also die Hauptaktivität gestartet wird, lädt sie die gespeicherten Daten aus der SQL-Datenbank in einer Listenansicht und führt dann eine JsonObjectRequest mit Volley durch. (Ein Async-Task)

Aber noch bin ich immer die folgenden Fehler, wenn die Haupttätigkeit startet

Skipped 88 frames! The application may be doing too much work on its main thread. 
Skipped 34 frames! The application may be doing too much work on its main thread. 

Die 88 Frames von der SQLite-Datenbank ist, laden alle gespeicherten Daten. Da, wenn ich nach unten wischen, um zu aktualisieren, mache ich nur die JsonObjectRequest und bekomme den Fehler mit wie 34 Frames.

Muss ich vielleicht die sqlite db auch in eine AsyncTask laden? Oder haben Sie eine andere Lösung?

Ich würde gerne Ihre Meinung hören. Vielen Dank im Voraus.

Wiljan

EDIT:

ich es nun wie folgt in einem Async setzen:

private class syncData extends AsyncTask<Void, Void, Void> { 
    private KerntaakListAdapter adapter; 

    public syncData(KerntaakListAdapter adapter) { 
     this.adapter = adapter; 
    } 

    /** 
    * The system calls this to perform work in a worker thread and 
    * delivers it the parameters given to AsyncTask.execute() 
    */ 
    @Override 
    protected Void doInBackground(Void... params) { 
     dataSource.syncData(swipeRefreshLayout); 
     return null; 
    } 

    /** 
    * The system calls this to perform work in the UI thread and delivers 
    * the result from doInBackground() 
    */ 
    protected void onPostExecute(String result) { 
     adapter.notifyDataSetChanged(); 
    } 
} 

Und mit diesem auslösen:

new syncData(adapter).execute(); 

Aber es gibt nach wie vor mir ein übersprungener Rahmenfehler. Obwohl die Frames etwas reduziert sind.

+1

Sie sollten also versuchen, Ihre Datenbank in einem separaten Thread zu lesen; aber es könnte andere Dinge in Ihrer App verursachen Rahmen Tropfen – Eenvincible

Antwort

1

Muss ich vielleicht die sqlite db auch in eine AsyncTask laden? Oder hast du eine andere Lösung?

Ja, standardmäßig werden alle Datenbankoperationen auf dem UI-Thread ausgeführt, was zu übersprungenen Frames führt.

Sie sollten Ihre Abfragen in einem Hintergrundthread ausführen. Verwenden Sie alles, was am besten für Sie funktioniert, es kann AsyncTask oder sogar ein Java Thread sein.

Ich würde empfehlen, ein Loader Framework für ausgewählte Abfragen zu verwenden, da Loader Manager einen sehr angenehmen Lebenszyklus an die Aktivität gebunden hat. Sie ermöglichen es Ihnen auch, die zugrunde liegenden Daten zu überwachen und sie nach der Änderung über ContentObserver s zu aktualisieren.

Wenn Sie eine ContentProvider verwenden, können Sie auch einen Blick auf AsyncQueryHandler werfen, wenn Sie andere Fragen wie Einfügen, Aktualisieren oder Löschen benötigen.

+0

Thnx für den Tipp! Ich habe es versucht, aber es wird noch nicht helfen .. Bitte lesen Sie meine Bearbeitung in meiner Frage für weitere Informationen. –

+0

Sorry, aber der Code, den du gezeigt hast, sieht absolut gut aus. Wenn Sie Frames immer noch übersprungen haben, bedeutet dies, dass das Problem woanders ist .. Suchen Sie weiter, wo Sie zu viel Arbeit an dem UI-Thread haben. Vielleicht sind einige Berechnungen, die in den Hintergrund verschoben werden können, die Daten loding, vielleicht ist die Ansichtshierarchie ineffizient und kann verbessert werden. Werfen Sie einen Blick auf http: // stackoverflow.com/questions/14678593/the-application-may-tu-too-much-works-on-its-main-thread und schau weiter .. Viel Glück :) –

+0

Du kannst eine neue Frage aktualisieren, falls du sie findest die Ursache und immer noch nicht wissen, wie es zu beheben ist. Bis jetzt sieht es gut aus. –

Verwandte Themen