如何在不使用 init 的情况下从 class 中启动协程?

How to launch a coroutine from within a class without using init?

我有以下 class:

class SomeApiRemoteSource (private var someApi: SomeApi)
{
    private val someData = MutableLiveData<Map<String, String>>()
    
    init 
    {
        GlobalScope.launch(Dispatchers.IO)
        {
            try
            {
                val response = someApi.getSomeData(SomeApi.API_KEY).awaitResponse()
    
                if(response.isSuccessful)
                    someData.postValue(response.body()?.data)
    
                else
                    someData.postValue(emptyMap())
            }
    
            catch (e: Exception)
            {
                Log.e("ds error", e.message!!)
    
                someData.postValue(emptyMap())
            }
        }
    }
    
    fun getSomeData(): MutableLiveData<Map<String, String>>
    {
        return someData
    }
}

一切正常,但是 有没有办法在不使用 init 的情况下获得相同的结果? 如果我需要 运行 另一个 API getter 调用? 我应该 运行 另一个协程就在第一个协程下面吗?这似乎效率低下。

您可以创建一个包含协程的函数,并且可以调用它任意次。

 class SomeApiRemoteSource (private var someApi: SomeApi)
    {
        private val someData = MutableLiveData<Map<String, String>>()
        private var apiJob: Job? = null
        
        init 
        {
            getDataFromAPI()
        }
        
        fun getDataFromAPI(){
         // Cancel previous job if already running
         apiJob?.cancel()
         apiJob = GlobalScope.launch(Dispatchers.IO)
            {
                try
                {
                    val response = someApi.getSomeData(SomeApi.API_KEY).awaitResponse()
        
                    if(response.isSuccessful)
                        someData.postValue(response.body()?.data)
        
                    else
                        someData.postValue(emptyMap())
                }
        
                catch (e: Exception)
                {
                    Log.e("ds error", e.message!!)
        
                    someData.postValue(emptyMap())
                }
            }
        }
        
        fun getSomeData(): MutableLiveData<Map<String, String>>
        {
            return someData
        }
    }

我明白了。从以前的答案中得到一些启发。

class FixerRemoteSource (private var fixerApi: FixerApi)
{
    suspend fun getAllSupportedSymbols(): Map<String, String>
    {
        val response = fixerApi.getAllSupportedSymbols(FixerApi.API_KEY)

        return if(response.isSuccessful) response.body()?.symbols!! else emptyMap()
    }
}

阻碍我的问题是当我调试协同程序时应用程序一直崩溃。从协程中删除了断点,一切都很好。