Каков наилучший способ организовать сопрограммы для приложения элегантным способом?Я понимаю, вопрос кажется странным.Позвольте мне показать пример Executors
Создать объект AppExecutors.kt
object AppExecutors {
private val main: Executor = MainThreadExecutor()
private val util: Executor = Executors.newFixedThreadPool(3)
fun main(f: () -> Unit) {
main.execute(f)
}
fun util(f: () -> Unit) {
util.execute(f)
}
class MainThreadExecutor : Executor {
private val mainThreadHandler = Handler(Looper.getMainLooper())
override fun execute(command: Runnable?) {
mainThreadHandler.post(command)
}
}
}
Теперь мы можем использовать это.Простой минимальный код и т. Д.
val exe = AppExecutors
exe.util {
val first = calculateFirst()
val second = calculateSecond()
val str = ("first = $first | second = $second")
exe.main {
Toast.makeText(activity, "Executors $str", Toast.LENGTH_LONG).show()
}
}
Теперь я попытался использовать этот подход на сопрограммах AppCoRoutines.kt
object AppCoRoutines{
private val uiContext: CoroutineContext = Dispatchers.Main
private val ioContext: CoroutineContext = Dispatchers.IO
private val networkContext: CoroutineContext = Executors.newFixedThreadPool(3).asCoroutineDispatcher()
private val singleContext: CoroutineContext = Executors.newSingleThreadExecutor().asCoroutineDispatcher()
val ui: CoroutineScope = CoroutineScope(uiContext)
val io: CoroutineScope = CoroutineScope(ioContext)
val net: CoroutineScope = CoroutineScope(networkContext)
val single: CoroutineScope = CoroutineScope(singleContext)
}
Теперь используйте это:
val coRout = AppCoRoutines
coRout.ui.launch {
val str: String = withContext(coRout.net.coroutineContext){
val first = async { calculateFirst() }
val second = async { calculateSecond() }
("first = $first | second = $second")
}
Toast.makeText(activity, "CoRoutine $str", Toast.LENGTH_LONG).show()
}
Не так уж и элегантно.Может быть, кто-то может предложить более простой способ?Сейчас я не очень хорош в этом, поэтому я использую сопрограммы для простых попыток.
Заранее спасибо!