5

Meine Abfrage dauert < 3 Millisekunden zum Ausführen. Aber das Problem ist, ich erstelle ein pojo Klassenobjekte von dem Cursor, den ich von der Abfrageausführung bekommen habe. Das Erstellen und Festlegen von Werten für Felder erfordert zu viel Zeit von mehr als 140 Millisekunden. Die Pojo-Klasse hat ungefähr 36 Felder. Irgendein Vorschlag, um dieses Problem zu lösen.Pojo Klassenerstellung von Sqlite Cursor dauert zu viel Zeit

Dank

+0

ich denke, Sie können postDelayed Handler verwenden, um die Zeit der Ausführung zu variieren –

+0

Sie können _CursorLoader_ dafür verwenden. – Piyush

+0

Ich habe die von Ihnen vorgeschlagenen Lösungen ausprobiert. Aber ich sehe immer noch die gleiche Nachricht im Log (d. H. App macht zu viel Arbeit im Haupt-Thread). Nachdem ich das Ergebnis bekommen habe, aktualisiere ich den Adapter. Ich meine, ich füge alle Elemente zu Arraylist hinzu, das innerhalb des Adapters verwendet wird, und ich rufe notifydataSetChanged() Methode innerhalb von runOnUiThread auf. Wenn ich diese Methode nicht anrufe, sehe ich keine Nachricht im Protokoll. Ich habe auch notifyItemInserted() versucht, aber das gleiche Ergebnis. notifyDatasetChanged-Methode sollte im Haupt-Thread aufgerufen werden, richtig? – ImGenie

Antwort

0

Wie viele Objekte instanziieren Sie? 36 Felder nicht zu viel gesehen.

Wenn Sie viele Objekte haben, können Sie sie in einem separaten Thread instanziieren. Natürlich müssen Sie eine Art Callback einrichten, um herauszufinden, wann alles geladen ist.

0

Ich weiß, dass die c.getColumnIndex() Methode mehr Zeit braucht. Die beste Methode, die ich kenne, die Dinge zu beschleunigen, ist die folgende:

Cursor c = null; 
try { 
    c = db.query(......); 
    if(c != null) { 

     int channelIdIndex = c.getColumnIndex(OptimizedMessage.CHANNEL_ID); 
     int clientIdIndex = c.getColumnIndex(OptimizedMessage.CLIENT_ID); 

     while (c.moveToNext()) { 
      OptimizedMessage newMessage = new OptimizedMessage(); 
      newMessage.setChannelId(c.getLong(channelIdIndex)); 
      newMessage.setClientId(c.getLong(clientIdIndex)); 

      messages.add(newMessage); 
     } 
    } 
} finally { 
    if (c != null) { 
     c.close(); 
    } 
} 

Sie können sehen, dass die c.getColumnIndex() Methode nur einmal verwendet wird.

+0

Ich habe die von Ihnen vorgeschlagenen Lösungen ausprobiert. Aber ich sehe immer noch die gleiche Nachricht im Log (d. H. App macht zu viel Arbeit im Haupt-Thread). Nachdem ich das Ergebnis bekommen habe, aktualisiere ich den Adapter. Ich meine, ich füge alle Elemente zu Arraylist hinzu, das innerhalb des Adapters verwendet wird, und ich rufe notifydataSetChanged() Methode innerhalb von runOnUiThread auf. Wenn ich diese Methode nicht anrufe, sehe ich keine Nachricht im Protokoll. Ich habe auch notifyItemInserted() versucht, aber das gleiche Ergebnis. notifyDatasetChanged-Methode sollte im Haupt-Thread aufgerufen werden, richtig? – ImGenie

+0

Ja, aber dann denke ich, dass dein Problem nicht mit der POJO-Erstellung zusammenhängt. Es ist etwas anderes. Versuchen Sie, benutzerdefinierte Ladeprogramme zu verwenden, in denen Sie alles im Hintergrundthread erstellen und das ViewHolder-Muster auf Ihrer Adapterseite verwenden können. Das ist der empfohlene Weg. – Blehi