как лучше реализовать функции бибилиотеки
Функции выполняют долгие операции (поход в сеть, вычисления)
Рассматриваю два варианта:
Делать с коллбэками, внутри, Sdk сам рулить потоками и возвращает в UI поток (varialOne)
Метод Sdk выполняется в потоке из которого вызвал потребитель (varianTwo)
Какой вариант и почему лучше использовать? p.s. в SDK все завязано на RXJava и SDK по сути только для Android
Вот примерно (Sdk отдельный подключаемый в Gradle проект, Consumer отдельный проект который использует Sdk)
class Sdk() {
private val mainThreadScheduler: Scheduler = if (isAndroid) AndroidSchedulers.mainThread() else anotherUiThread
fun loadData(callback: Callback) {
loadDataFromNetwork() //библиотека сама обрабатывает переключения по потокам\
.subscribeOn(Schedulers.io())
.observeOn(mainThreadScheduler)
.doOnSubscribe { callback.onLoading() }
.subscribe({
callback.onSuccess(it)
}, {
callback.onError(it)
})
}
fun loadData(): Data {
//библиотека выполняет код в UI (потрибитель должен позоботиться о выпереключении потока)
return loadDataFromNetwork().blockingGet()
}
}
class AndroidConsumer {
val sdk = Sdk()
fun variantOne() {
sdk.loadData(object : Callback {
override fun onLoading() {
TODO("Not yet implemented")
}
override fun onError(e: Throwable) {
TODO("Not yet implemented")
}
override fun onSuccess(value: Data) {
TODO("Not yet implemented")
}
})
}
fun variantTwo() {
//если у пользователя бибилиотеки RX
Single.fromCallable { sdk.loadData() }
.subscribe({ data ->
}, { error ->
})
//если просто Thread, Executors, AsyncTask и т.д.
Thread {
val data = sdk.loadData()
//handle data
}.start()
//корутины
//можно будет заюзать этот метод?
}
}
//какой-то репозиторий c Rx
fun loadDataFromNetwork(): Single<Data> = Single.just(Data(""))
interface Callback {
fun onLoading()
fun onError(e: Throwable)
fun onSuccess(value: Data)
}
data class Data(val a: String)
Ответы (1 шт):
Любой способ подходит.
Предлагаю вам самый простой использовать - пусть библиотека выдаёт наружу метод, возвращающий данные, а пользователь библиотеки пусть сам решает как ему этот метод использовать - с RxJava, Coroutines, Thread, AsyncTask.
Если же хочется заморочиться - можете сделать доступными все способы - и с колбэком, и с возвращением Single и даже suspend.