Возможно, это не лучшее решение, но я бы попытался сделать это следующим образом:
public final class SimpleCacheSingle<T : Any> constructor(
val apiRequest: (value: String, callback: (T) -> Unit) -> Unit
) {
private var lastTimeSeconds = 0L
private lateinit var cachedValue: T
fun getSingle(): Single<T> = Single.create { emitter ->
if (System.currentTimeMillis() / 1000 - lastTimeSeconds > 60) {
apiRequest("example argument") {
cachedValue = it
lastTimeSeconds = System.currentTimeMillis() / 1000
emitter.onSuccess(cachedValue)
}
} else {
emitter.onSuccess(cachedValue)
}
}
}
Просто создайте его экземпляр и используйте getSingle () для создания отдельного для каждого подписчика.
Конечно, «apiRequest» в прикрепленном фрагменте кода необходимо изменить в соответствии с вашими потребностями.
Изменить: Обратите внимание, что когда вы подпишетесь до завершения предыдущего вызова API, у вас будет два илибольше ожидающих запросов API вместо одного.Вам нужно будет изменить код так, чтобы одновременно был только один запрос.