5

Sto compilando un elenco di dati e questi dati vengono caricati in 3 passaggi, quindi dopo che il primo passaggio è finito ho già mostrato i dati all'utente. Quindi aggiorno l'interfaccia utente passo per passo ogni volta che lo stato di caricamento dei dati cambia ...Caricamento effettivo dei dati in RecycleView

Io uso un RecyclerView per visualizzare i miei dati. Potrei osservare che quando il caricamento dei singoli passaggi è molto veloce, l'interfaccia utente sta bloccando (specialmente quando l'utente sta scorrendo molto velocemente) ... Quindi ho bisogno di raggruppare gli eventi e aggiornare l'interfaccia ogni x ms. ..

Con i test che ho visto, l'aggiornamento dell'interfaccia utente ogni 150 ms sembra essere bello e veloce e non porta a nessuna balbuzie visibile.

Ma non sono sicuro di come reagiscono dispositivi precedenti o altri dispositivi.

Qualcuno ha esperienza in questa direzione e può dirmi quale valore sarebbe buono?

Domanda di carattere generale

Probabilmente la domanda può essere fatta anche più in generale: quando si aggiorna l'interfaccia utente molto frequentemente, qual è la frequenza migliore da utilizzare per evitare il blocco dell'interfaccia utente? O qual è il tempo minimo di attesa prima di aggiornare nuovamente l'interfaccia utente

risposta

8

La tua domanda è molto interessante e ci sono alcuni metodi per risolvere. Ho appena messo alcune soluzioni qui con riferimento.

1. cache i dati

Quando scrollare su e giù, l'adattatore interrogherà alcuni dati da serie, dal database o di rete. A causa della tua prestazione lenta, suppongo che potrebbe essere un problema perché il tempo di caricamento dei dati è lungo. Quindi il metodo migliore per risolvere questo problema è il caching dei dati.

È possibile memorizzare nella cache i dati su memoria utilizzando LRUCache classe e sul disco utilizzando DiskLRUCache V'è una linea guida di Android per questo problema: Caching bitmap

Psuedo codice:

if (memoryCache.get(key)) { 
    // load data from memory and assign to cell 
} else if (diskCache.get(key)) { 
    // load data from disk and assign to cell 
} else { 
    // get data from database or network 
    // assign to cell 
    // save to memory cache 
    // save to disk cache 
} 

2. Utilizzare thread diverso per il caricamento dei dati

Quando si elabora un'attività di lunga durata sull'interfaccia utente, è necessario passare all'interfaccia utente e crea una nuova discussione per il tuo scopo. È possibile utilizzare Asynctask per questo scopo.

Il problema in questo metodo è: durante il caricamento dei dati dallo sfondo, la cella visualizzata sullo schermo dall'evento di scorrimento richiede dati diversi. Quindi, quando il vecchio oggetto asynctask ha finito il lavoro, assegna vecchi dati alla tua cella. BUMP !!!. Quindi devi controllare attentamente lo stato della tua cella. C'è un bel tutorial: Process Image Loading In Different Thread

3. semplificare la vostra vista

Se non si utilizza qualcosa come la manipolazione di database, richiesta di rete durante lo scorrimento, forse il problema è il vostro punto di vista è troppo complesso. È necessario utilizzare questo strumento: Hierarchy Viewer per verificare quale file di layout presenta problemi di prestazioni.Puoi anche usare lo strumento GPU Overdraw tool per verificare se molte parti sulla tua vista hanno disegnato molte cose inutili.

4. Rileva il tempo per l'aggiornamento dei data base sul frame rate

Si deve sempre mantenere la velocità dei fotogrammi sotto 60fps. Con quel frame rate, l'utente non riconoscerà lag, clunky ... nella tua vista. È possibile utilizzare GPU Profiler per verificare la frequenza dei fotogrammi. Basandosi su tale frame rate, deciderete di semplificare la visualizzazione, ottimizzare il metodo onDraw o ottimizzare il disegno GPU (a causa di un sovrascrittura) per mantenere il frame rate dell'interfaccia utente < = 60fps.

Tutti i metodi sopra riportati sono integrati nel mio progetto denominato ImageUploader. Questa applicazione carica l'immagine sul servizio Flickr e visualizza l'elenco di tutte le immagini caricate o visualizza le singole immagini.

Google ha caricato una serie di Android Performance Pattern ti insegnano molte cose utili come il caching, dosaggio, consigli utili ...

Spero che questo aiuto :)

+1

In realtà, non ho alcun problema con il caching dei dati e l'aggiornamento Interfaccia utente, utilizzo un metodo simile al tuo secondo suggerimento, ovvero utilizzo RXJava + background execution + buffer e emetto solo i miei risultati ogni 150 ms e questo viene fatto in modo raggruppato. In questo modo, posso aggiornare l'interfaccia utente abbastanza bene ... Tuttavia, mi interessa l'intervallo di tempo che dovrei usare o se c'è un intervallo di tempo per l'uso che è ben collaudato o addirittura suggerito (forse ufficialmente) ... – prom85

+1

PS : ovviamente, gestire lo stato delle celle è già stato fatto ;-). Solo una domanda aperta per me è, quanto spesso dovrei aggiornare il 'RecyclerView'? O più in generale, con quale frequenza devo aggiornare qualsiasi 'View' o c'è una frequenza massima massima o" buona "per aggiornare le viste ... – prom85

+0

dipende dai dati (quanto complessa query, quantità di server, rete ...). Devi profilare il tuo codice per sapere che intervallo di tempo. Ma ** sempre ** mantiene la frequenza fotogrammi di 60 fps. Dovresti usare GPU Profiler per verificare come è corrente la frequenza dei fotogrammi. http://developer.android.com/tools/performance/profile-gpu-rendering/index.html – hqt

Problemi correlati