5

Wypełniam listę danych i te dane są ładowane w 3 krokach, więc po pierwszym kroku jest już wyczyszczony, pokazuję już dane użytkownikowi. Następnie aktualizuję interfejs użytkownika krok po kroku, gdy stan ładowania danych zmieni się ...Ładowanie danych skutecznie w RecycleView

Używam RecyclerView do wyświetlania moich danych. Zauważyłem, że gdy ładowanie pojedynczych kroków jest bardzo szybkie, interfejs jest blokowany (szczególnie, gdy użytkownik przewija się bardzo szybko) ... Dlatego muszę zgrupować zdarzenia i aktualizować interfejs użytkownika co x ms. ..

Podczas testów zobaczyłem, że aktualizowanie interfejsu użytkownika co 150ms wydaje się dobrze i szybko wyglądać i nie prowadzi do żadnego widocznego jąkania.

Ale nie jestem pewien, jak reagują starsze urządzenia lub inne urządzenia.

Czy ktoś ma jakiekolwiek doświadczenie w tym kierunku i może mi powiedzieć, która wartość byłaby dobra?

ogólne pytanie

Prawdopodobnie pytanie można zadać jeszcze bardziej ogólnie: bardzo często podczas aktualizowania UI, co jest najlepszym czestotliwosc użyć, aby uniknąć blokowania UI? Lub jaki jest minimalny czas oczekiwania na aktualizację interfejsu użytkownika?

Odpowiedz

8

Twoje pytanie jest bardzo interesujące i istnieje kilka metod rozwiązywania problemów. Po prostu zamieszczam tutaj kilka rozwiązań z referencją.

1. Pamięć podręczna danych

Podczas przewijania użytkownika, adapter odpytuje niektórych danych z tablicy z bazy danych lub w sieci. Z powodu niskiej wydajności, prawdopodobnie jest to problem, ponieważ długi czas ładowania danych. Najlepszą metodą rozwiązania tego problemu jest buforowanie danych.

Można buforować dane w pamięci przy użyciu LRUCache klasę i na dysku za pomocą DiskLRUCache Jest Android Wytyczne dla tego problemu: Caching bitmap

Psuedo Kod:

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. Zastosowanie inny wątek do ładowania danych

Podczas przetwarzania długo działającego zadania wpływa na interfejs użytkownika, należy odłożyć do wątku interfejsu użytkownika i utwórz nowy wątek dla swojego celu. W tym celu można użyć Asynctask.

Problem w tej metodzie: podczas ładowania danych z tła wyświetlana komórka na ekranie według zdarzenia przewijania musi mieć inne dane. Tak więc, gdy stary obiekt asynktaksu zakończył pracę, przypisuje stare dane do komórki. BUMP !!!. Musisz więc uważnie kontrolować stan swojej komórki. Jest ładny poradnik: Process Image Loading In Different Thread

3. Uproszczenie Państwa zdanie

Jeśli nie używać czegoś takiego jak obsługa baz danych, żądania sieci podczas przewijania, być może problem jest Twój pogląd jest zbyt skomplikowane. Powinieneś użyć tego narzędzia: Hierarchy Viewer do sprawdzenia, który plik układu ma problem z wydajnością.Możesz również użyć narzędzia GPU Overdraw tool do sprawdzenia, czy wiele części na ekranie nie rysuje wielu rzeczy.

4. Wykrywanie czasu na aktualizowanie bazy danych o szybkości klatek

Musisz zawsze trzymać klatek poniżej 60fps. Przy tej liczbie klatek na sekundę użytkownik nie rozpozna opóźnienia, niezdarności ... w twoim widoku. Do sprawdzania szybkości klatek można użyć wartości GPU Profiler. Opierając się na tej liczbie klatek, zdecydujesz, że powinieneś uprościć widok, zoptymalizować metodę onDraw lub zoptymalizować rysunek GPU (z powodu przekroczenia limitu), aby utrzymać swoją liczbę klatek na sekundę w trybie UI: < = 60 klatek na sekundę.

Wszystkie powyższe metody zostały zintegrowane z moim projektem o nazwie ImageUploader. Ta aplikacja przesyła obraz do usługi Flickr i wyświetla listę wszystkich przesłanych obrazów lub wyświetla pojedyncze obrazy.

Google dodał seria Android Performance Pattern Teach Państwo wiele przydatnych rzeczy, takich jak buforowanie, Składowanie, przydatnych wskazówek ...

nadzieję, że to pomaga :)

+1

Właściwie, nie mam problemu z buforowania danych i aktualizowania UI, używam metody podobnej do twojej drugiej sugestii, a mianowicie używam RXJava + wykonania tła + bufora i emituję tylko moje wyniki co 150 ms, a to odbywa się w zgrupowany sposób. W ten sposób mogę dość dobrze zaktualizować interfejs użytkownika ... Nadal jestem zainteresowany czasem, w którym powinienem skorzystać lub jeśli jest jakiś czas na wykorzystanie, który jest dobrze przetestowany lub nawet (być może oficjalnie) sugerowany ... – prom85

+1

PS : oczywiście obsługa stanów komórek jest już wykonana ;-). Mam tylko otwarte pytanie, jak często powinienem aktualizować "RecyclerView"? Lub bardziej ogólnie, jak często powinienem aktualizować 'View' lub czy istnieje maksymalna lub" dobra "maksymalna częstotliwość aktualizacji widoków ... – prom85

+0

to zależy od danych (jak złożone zapytanie, ilość serwera, sieć ...). Musisz profilować swój kod, aby poznać ten czas. Ale ** zawsze ** zachowuje twoją liczbę klatek na sekundę 60 fps. Do sprawdzenia, jak aktualna jest twoja liczba klatek na sekundę, powinieneś użyć programu GPU Profiler. http://developer.android.com/tools/performance/profile-gpu-rendering/index.html – hqt

Powiązane problemy