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 :)
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
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
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