簡體   English   中英

Kotlin協程不下載數據

[英]Kotlin coroutines not downloading data

我在Android項目中使用Kotlin corountines。 我正在嘗試下載一些數據並在textview中顯示。

以下是我的代碼

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        tv.setOnClickListener {
            downloadData()
        }
    }


    private fun downloadData() {

        runBlocking {
            pb_activity_main.visibility = View.VISIBLE
            var data = ""
            async {
                data = downloadDataBlocking()
            }.await()
            tv.text = data
            pb_activity_main.visibility = View.GONE

        }
    }


    private fun downloadDataBlocking(): String {
        val client = OkHttpClient()
        val request = Request.Builder().url("https://jsonplaceholder.typicode.com/posts").build()
        val response = client.newCall(request).execute()
        return response.body()?.string() ?: ""
    }
}

但是沒有下載數據。 我不知道為什么。

我已將Internet許可包括在清單中,並且該網址也正在工作。

嘗試這個:

class MainActivity : AppCompatActivity(), CoroutineScope {

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

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        tv.setOnClickListener {
            downloadData()
        }
    }


    private fun downloadData() {
        launch {
            pb_activity_main.visibility = View.VISIBLE
            tv.text = withContext(Dispatchers.IO) { downloadDataBlocking() }
            pb_activity_main.visibility = View.GONE
        }
    }


    private fun downloadDataBlocking(): String {
        val client = OkHttpClient()
        val request = Request.Builder().url("https://jsonplaceholder.typicode.com/posts").build()
        val response = client.newCall(request).execute()
        return response.body()?.string() ?: ""
    }
}

首先: 永遠不要在單元測試或其他特殊域之外使用runBLocking

協程不應該使用此功能 它旨在將常規的阻塞代碼橋接到以掛起方式編寫的庫中,以用於主要功能和測試中。

第二:

協程始終與您的應用程序中的某些本地范圍相關 ,該范圍是生命周期有限的實體, 例如UI元素

這就是為什么Activity實現CoroutineScope的原因。 老實說,最好的地方是ViewModelPresenter ,但我在代碼中看不到任何東西...

第三,在定義后立即使用asyncawait毫無意義。 只需使用withContext然后。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM