У меня была похожая проблема, и я решил ее следующим образом: предварительная загрузка данных выполняется путем отправки асинхронных запросов на сервер. Когда индикатор выполнения виден, я увеличиваю счетчик для каждого запроса. Размер индикатора выполнения == счетчик. Поскольку запросы отправляются быстро, пользователь никогда не замечает изменения максимального значения индикатора выполнения.
Когда приходит ответ на запрос, я каждый раз продвигаю индикатор выполнения. Вот и все. Когда поступает последний запрос, предварительная загрузка заканчивается.
Это выглядит лучше, когда ответы небольшие и приходят быстро, но это работает во всех случаях.