TdApi.GetChatHistory или как правильно вызвать вывод истории чата?
По вводным: занимаюсь разработкой своего клиента Telegram под Wear Os
Сейчас ситуация такая: я пере проверял много вариантов как выводить истории чата, но все они не идеальны и не хотят нормально функционировать, чтение документации не дало прояснений.
По вводным: в первом варианте он загружается сообщения по каким то законам хогвартса, когда захочет.
По вводным: во втором он их загружает но по одному при скролле что плохо выглядит.
Сейчас ситуация такая: оставил код на github тк сюда не влезает:
Код
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
В TDLib метод
getChatHistoryработает не как “дай сразу всю историю”, а как постраничная загрузка вокруг конкретного сообщения. Если при скролле сообщения приходят хаотично или по одному, обычно неправильно выбраны параметрыfrom_message_id,offsetиlimit, либо запросы запускаются параллельно.Типовая схема для первого открытия чата: загрузить последние N сообщений:
client.send(TdApi.GetChatHistory( chatId, 0, 0, 30, false )) { result -> // result as TdApi.Messages }
Для подгрузки старых сообщений берёте минимальный message.id из уже показанных сообщений и передаёте его как
fromMessageId:client.send(TdApi.GetChatHistory( chatId, oldestMessageId, 0, 30, false )) { result -> // добавить старые сообщения в начало списка }
Важно не запускать несколько запросов истории одновременно. Сделайте флаг:
var loadingHistory = false fun loadOlder() { if (loadingHistory) return loadingHistory = true // GetChatHistory... // в callback: loadingHistory = false }
Для Wear OS лучше не тянуть огромную историю. Держите локальный список последних сообщений, подгружайте пачками по 20-30 и обновляйте UI через diff, а не пересоздавайте весь список.
Ещё учитывайте, что TDLib асинхронный: порядок callback не обязан совпадать с порядком отправки запросов. Поэтому сортируйте сообщения по
idилиdate, дедуплицируйте поmessage.idи не добавляйте одно сообщение дважды.Итог: первый запрос делайте от
from_message_id = 0, старую историю грузите от самого старого message id, запросы не параллельте, сообщения дедуплицируйте и сортируйте перед показом.