5

La mia query sta prendendo < 3 milli secondi per l'esecuzione. Ma il problema è che sto creando oggetti di classe Pojo dal cursore che ho ottenuto dall'esecuzione della query. Questa creazione di oggetti e l'impostazione dei valori nei campi richiede troppo tempo oltre 140 milli secondi. La classe Pojo ha circa 36 campi. Qualche suggerimento per risolvere questo problema?La creazione della classe Pojo dal cursore Sqlite richiede troppo tempo

Grazie

+0

Penso che sia possibile utilizzare il gestore post-ritardo per variare il tempo di esecuzione –

+0

È possibile utilizzare _CursorLoader_ per quello. – Piyush

+0

Ho provato le soluzioni che hai suggerito. Ma sto ancora vedendo lo stesso stesso messaggio nel log (l'app sta facendo troppo lavoro nel thread principale). Dopo aver ottenuto il risultato, sto aggiornando l'adattatore. Voglio dire che sto aggiungendo tutti gli elementi a Arraylist che viene utilizzato all'interno dell'adattatore e sto chiamando il metodo notifydataSetChanged() all'interno di runOnUiThread. Se non chiamo questo metodo, non vedo alcun messaggio nel registro. Ho anche provato notifyItemInserted() ma lo stesso risultato. notifyDatasetChanged dovrebbe essere chiamato nel thread principale giusto? – ImGenie

risposta

0

Quanti oggetti stai creando? 36 campi non visti troppo.

Se si dispone di molti oggetti, è possibile creare un'istanza in un thread separato. Ovviamente dovrai impostare una sorta di richiamata per sapere quando tutto è caricato

0

So che il metodo c.getColumnIndex() richiede più tempo. Il metodo migliore che io conosca per velocizzare le cose è la seguente:

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(); 
    } 
} 

Si può vedere che il metodo c.getColumnIndex() viene utilizzato una sola volta.

+0

Ho provato le soluzioni che hai suggerito. Ma sto ancora vedendo lo stesso stesso messaggio nel log (l'app sta facendo troppo lavoro nel thread principale). Dopo aver ottenuto il risultato, sto aggiornando l'adattatore. Voglio dire che sto aggiungendo tutti gli elementi a Arraylist che viene utilizzato all'interno dell'adattatore e sto chiamando il metodo notifydataSetChanged() all'interno di runOnUiThread. Se non chiamo questo metodo, non vedo alcun messaggio nel registro. Ho anche provato notifyItemInserted() ma lo stesso risultato. notifyDatasetChanged dovrebbe essere chiamato nel thread principale giusto? – ImGenie

+0

Sì, ma penso che il tuo problema non sia nella creazione del POJO. È qualcos'altro Prova a utilizzare caricatori personalizzati in cui puoi creare tutto nel thread in background e utilizzare il pattern ViewHolder sul lato dell'adattatore. Questo è il modo consigliato. – Blehi