У меня есть вопрос для загрузки чрезвычайно длинного изменяемого списка сообщений.
Прежде всего, для людей, которые не знают, что такое Android Recycleler: вы загружаете партию постов с сервера, например, 25 постов, и отображаете их в прокручиваемом списке. когда вы прокручиваете дальше и хотите получить доступ к элементу в позиции 25, вы загружаете следующую партию с сервера. Recyclelerview - моя конкретная проблема, но такая же проблема может возникнуть на веб-сайтах и т. Д.
Так вот в чем проблема: допустим, посты упорядочены по лайкам, и у нас есть посты в порядке {a, b, c, d, e, f, g, h} с уменьшением лайков. Наш размер пакета равен 3, поэтому мы всегда загружаем 3 сообщения. Наш экран может отображать 2 сообщения одновременно. Начнем с загрузки {a, b, c}. Мы ждем 10 минут, прежде чем прокрутить вниз и загрузить pos3, pos4 и pos5. В это время лайки меняются, и новый порядок {a, b, d, c, f, e, g, h}. Наш следующий пакет будет {c, f, e}, поскольку наш внутренний запрос будет выглядеть как backend.com/get3items/?batch=1. Так как наш экран может отображать 2 сообщения, он может отображать pos2 и pos3, то есть {c, c}.
То же самое может произойти, если мы удалим или добавим элемент. batchsize = 1, list = {a, b, c}. Мы загружаем. Новый элемент g добавляется в начало списка. Мы загружаем снова.
Другие факты: Количество элементов на экране может быть больше или меньше, чем размер пакета. Изменения в списке могут произойти в любой позиции. Возможно, мы загружаем партию № 500, но в pos0 произошли изменения. Код позади backend.com/get3items/?batch=1 можно сделать с помощью «select * from items order by likes desc limit 3, 3»
Для ответа я подумал об этом:
1) Сервер уведомляет клиента о том, что изменение произошло через шаблон наблюдателя. бесполезно, потому что если число подписчиков составляет около 1 миллиона, сервер умирает при каждом изменении (+ это не подходит для отдыха, поскольку сервер должен отслеживать подписчиков).
2) Сервер может рассчитать, каким был список в предыдущий раз. Вах, есть ли какая-то бэкэнд-техника, о которой я никогда не слышал?
3) Каждый раз, когда загружается новый пакет, другие пакеты в буфере и списке становятся недействительными. В этом случае окно рециркуляции вызовет notifyondatasetchanged, и все показанные элементы будут перезагружены (поэтому снова загружаются только нужные партии). при загрузке пакетов здесь мы должны убедиться, что другие партии не будут снова аннулированы, поскольку у нас будет бесконечный цикл обновлений. с другой стороны - что происходит, когда происходит изменение между перезагрузкой пакетов здесь? опять то же самое, так что, к сожалению, не решение.
Если я посмотрю посты на 9gag: вы можете прокрутить, но вы получаете элементы того времени, когда вы загрузили сайт (и в старом порядке). Вы увидите только новые сообщения, если обновите страницу. так что-нибудь, как описано в 2)?