函数执行长操作(网络、计算)
我正在考虑两种选择:
为了处理回调,在内部,Sdk 本身管理线程并返回到 UI 线程(varialOne)
Sdk 方法在消费者调用 ( varianTwo )的线程上执行
哪个选项以及为什么更好用?ps 在 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)
任何方式都很好。
我建议你使用最简单的一个——让库公开一个返回数据的方法,让库用户决定如何使用这个方法——使用 RxJava、Coroutines、Thread、
AsyncTask。如果你想弄糊涂,你可以让所有方法都可用——用回调,用 return
Single,甚至suspend.