kotlin 无法第二次启动协程

waxmsbnn  于 2023-05-18  发布在  Kotlin
关注(0)|答案(2)|浏览(301)

我写了一些协程,它将触发ViewModel函数来执行API调用。协程在onCreateView部分。
协程本身看起来像这样:

val myCoroutine =
        viewLifecycleOwner.lifecycleScope.launch(start = CoroutineStart.LAZY) {
            Log.i(TAG, "onCreateView: ?")
            mViewModel.performApiCall()
            mViewModel.myLiveData.observe(viewLifecycleOwner, Observer { obj ->
                when (obj ) {
                    is DataWrapper.Success -> {
                        Log.i(TAG, "onCreateView: ${obj.data}")
                        
                    }

                    is DataWrapper.Error -> {
                        Log.e(
                            TAG,
                            "onCreateView: couldn't perform an api call ${obj.message}"
                        )
                    }
                }
            })
        }

我想在用户点击按钮后启动这个协程:

mBinding.conversionConverseBtn.setOnClickListener {
                myCoroutine.start()  
}

在第一次之后,一切都很正常,但是我已经实现了SwiperRefreshLayout,当我刷新布局时(我的意思是设置用户输入片段时的UI),它不工作。我几乎记录了每一步,结果发现刷新后myCoroutine就不活动了,当我调用.start()的时候,它似乎也没有启动。我该怎么解决呢?

zpf6vheq

zpf6vheq1#

协程只能启动一次,你需要使用launch创建新的协程来再次运行它,我建议将执行API调用的代码移动到一个方法中,并在刷新时调用它

fun fetchData(){
  viewLifecycleOwner.lifecycleScope.launch(start = CoroutineStart.LAZY) {
     mViewModel.performApiCall()
  }
}

fun onCreateView(){
  fetchData()
  mViewModel.myLiveData.
    observe(viewLifecycleOwner, Observer { obj ->
         when (obj) {
             is DataWrapper.Success -> {
                 Log.i(TAG, "onCreateView: ${obj.data}")
             }
             is DataWrapper.Error -> {
                 Log.e(TAG, "onCreateView: couldn't perform an api call ${obj.message}")
             }
          }
     })
}
ecfdbz9o

ecfdbz9o2#

你可以像这样在代码中使用getter:

val myCoroutine: Job
get() = viewLifecycleOwner.lifecycleScope.launch(start = CoroutineStart.LAZY) {
    // Your code
}

请注意,您应该将myCoroutine示例化为类中的变量,而不是在onCreateView节中。然后,您可以根据需要多次调用myCoroutine.start()

相关问题