5

Я заполняю список данных, и эти данные загружаются в 3 шага, поэтому после первого шага финишировало я уже показываю данные пользователю. Затем я обновляю пользовательский интерфейс каждый шаг при изменении состояния загрузки данных ...Загрузка данных эффективно в RecycleView

Я использую RecyclerView для отображения моих данных. Я мог заметить, что когда загрузка отдельных шагов происходит очень быстро, пользовательский интерфейс блокируется (особенно когда пользователь в данный момент прокручивается очень быстро). Поэтому мне нужно сгруппировать события и обновлять только пользовательский интерфейс каждые x ms. ..

С тестированием я увидел, что обновление пользовательского интерфейса каждые 150 мс кажется хорошим и быстрым и не приводит к каким-либо видимым заиканиям.

Но я не уверен, как реагируют старые устройства или другие устройства.

У кого-нибудь есть опыт в этом направлении и может сказать мне, какая ценность будет хорошей?

Общий вопрос

Вероятно, вопрос может быть даже в более общем плане: при обновлении интерфейса очень часто, что это лучший частотность использовать, чтобы избежать блокировки UI? Или какое минимальное время ожидания перед обновлением пользовательского интерфейса снова

ответ

8

Ваш вопрос очень интересный и есть некоторые способы решения. Я просто приведу некоторые решения здесь со ссылкой.

1. кэшировать данные

При прокрутке, адаптер будет запрашивать некоторые данные из массива, из базы данных или сети. Из-за низкой производительности, я думаю, может быть, проблема, потому что длительное время загрузки данных. Поэтому лучшим способом решения этой проблемы является кэширование данных.

Вы можете кэшировать данные в памяти, используя LRUCache класс и на диске с помощью DiskLRUCache Существует Android Руководство по этой проблеме: Caching bitmap

псевдопользователей код:

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. Используйте другой поток для загрузки данных

Когда вы обрабатываете долгосрочную задачу, влияющую на ваш пользовательский интерфейс, вы должны отложить переход к пользовательскому интерфейсу и создайте новую тему для своей цели. Для этой цели вы можете использовать Asynctask.

Проблема в этом методе заключается в следующем: при загрузке данных из фона отображаемая ячейка на экране с помощью события прокрутки требует разных данных. Таким образом, когда старый объект asynctask завершил работу, он назначает старые данные вашей ячейке. BUMP !!!. Поэтому вы должны тщательно контролировать состояние своей клетки. Существует хороший учебник: Process Image Loading In Different Thread

3. Упростить ваш взгляд

Если вы не используете что-то такое, как обработка базы данных, запрос сети при прокрутке, возможно, проблема заключается ваша точка зрения является слишком сложным. Вы должны использовать этот инструмент: Hierarchy Viewer для проверки того, какой файл макета имеет проблемы с производительностью.Вы также можете использовать инструмент GPU Overdraw tool для проверки того, что многие части на вашем представлении привлекли много ненужных вещей.

4. Определить время для обновления базы данных на скорости

кадров Вы должны всегда держать частоту кадров ниже 60fps. С этой частотой кадров пользователь не будет распознавать лаг, неуклюжий ... на ваш взгляд. Вы можете использовать GPU Profiler для проверки частоты кадров. Основываясь на этой частоте кадров, вы решите, что вам необходимо упростить просмотр, оптимизировать метод onDraw или оптимизировать графический чертеж (из-за переустановки) для поддержания частоты кадров пользовательского интерфейса < = 60 кадров в секунду.

Все вышеперечисленные методы, которые я включил в мой проект под названием ImageUploader. Это приложение загружает изображение в службу Flickr и отображает список всех загруженных изображений или просматривает отдельные изображения.

Google загрузил ряд Android Performance Pattern научить вас много полезных вещей, таких как кэширование, пакетирования, полезные советы ...

Надежда это поможет :)

+1

На самом деле, у меня нет проблем с кэширования данных и обновления UI, я использую метод, аналогичный вашему второму предложению, а именно, я использую RXJava + background execution + buffer и только выдаю свои результаты каждые 150 мс, и это делается сгруппированным способом. Таким образом, я могу неплохо обновить пользовательский интерфейс ... Тем не менее, меня интересует промежуток времени, который я должен использовать, или если есть какой-то промежуток времени для использования, который хорошо протестирован или даже (возможно, официально) предложил ... – prom85

+1

PS : конечно, обработка состояния ячеек уже выполнена ;-). Вопрос только для меня: как часто мне нужно обновлять «RecyclerView»? Или, в более общем плане, как часто мне нужно обновлять любой «Просмотр» или есть максимальная или «хорошая» максимальная частота для обновления просмотров ... – prom85

+0

это зависит от ваших данных (как сложный запрос, количество серверов, сеть ...). Вы должны прокомментировать свой код, чтобы узнать этот промежуток времени. Но ** всегда ** поддерживает частоту кадров 60 кадров в секунду. Вы должны использовать GPU Profiler для проверки текущей частоты кадров. http://developer.android.com/tools/performance/profile-gpu-rendering/index.html – hqt