Kotlin使用工作线程中的协程等待并从UI线程中获取某些东西

时间:2019-09-25 12:05:29

标签: android multithreading kotlin kotlin-coroutines

假设您正在import RNOtpVerify from 'react-native-otp-verify'; getHash = () => RNOtpVerify.getHash() .then(console.log) .catch(console.log); startListeningForOtp = () => RNOtpVerify.getOtp() .then(p => RNOtpVerify.addListener(this.otpHandler)) .catch(p => console.log(p)); otpHandler = (message: string) => { const otp = /(\d{4})/g.exec(message)[1]; this.setState({ otp }); RNOtpVerify.removeListener(); Keyboard.dismiss(); } componentWillUnmount() { RNOtpVerify.removeListener(); } 中执行长时间运行的任务。但是,为了完成上述长期运行的任务,您必须从WorkerThread那里得到一些东西。

基本上,我需要访问 UI线程,它将生成一个必须在UI线程上初始化但可以在任何线程中使用的对象。

我想做的可能是使用协程/暂停函数,其中工作线程实际上等待UI线程上的操作完成。

我如何实现这样的目标?谢谢!

以下内容代表了我要实现的目标:

UI Thread

我希望有帮助。

3 个答案:

答案 0 :(得分:3)

您可以尝试以下操作:

1 function () 
2 {
3 }

答案 1 :(得分:0)

使用Dispatchers.MainDispatchers.IO可能会允许您使用不同的上下文,但是我们需要了解,启动新的协程并不等同于启动新的线程。协程是轻量级的线程。为了进行交流,您需要使用一些称为Channels的概念。请参阅此link

类似地,您可以使用线程将协程链接到另一个上的协程

答案 2 :(得分:0)

只需在您的类中实现 CoroutineScope 并将类中的变量定义为

 private val job = Job()
 override val coroutineContext: CoroutineContext
 get() = job + Dispatchers.Main

现在您可以在课堂上照做:-

launch(Dispatchers.Main) {
    val data = async(Dispatchers.IO) {
        // do your work in background thread
    }.await()
    //And now data return on UI thread
}

示例:-

    Class MyClassFragment: Fragment(), CoroutineScope {
private val job = Job()
override val coroutineContext: CoroutineContext
    get() = job + Dispatchers.Main

override fun onActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)

    launch(Dispatchers.Main) {
        val data = async(Dispatchers.IO) {
            // do your background operation
        }.await()
        //And now data return on UI thread
    }
}

}