问一个关于 kotlin 协程 lifecycleScope 用法和内存泄漏的问题。

2021-01-07 18:05:43 +08:00
 m30102

在随便一个 Activity 上启动此 Activity,然后迅速关闭,leakcanary 就会报内存泄漏。引用链包括了传入的第二个参数 lambda 对象和 Okhttpclient,这里泄漏的原因是什么呢? 一般 retrofit 或者 okhttpclient 对象全局只需要一个就行了吧, 如果还是需要传参和传回调的方式访问网络,该如何正确修改下面的代码呢?

class TestActivity:AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_test)
        requestBylifecycleCoroutine("https://www.baidu1.com/"){
            Log.w("TestActivityTAG","result:"+it)
        }
    }

    val client = OkHttpClient.Builder().build()
    fun requestBylifecycleCoroutine(url: String, callBack: (s: String) -> Unit) {
        lifecycleScope.launch {
            val result = withContext(Dispatchers.IO) {
                suspendCoroutine<String> { continuation ->
                    val request = Request.Builder().url(url).build()
                    val newCall = client.newCall(request)
                    newCall.enqueue(object : Callback {
                        override fun onFailure(call: Call, e: IOException) {
                            continuation.resume("fail")
                        }
                        override fun onResponse(call: Call, response: Response) {
                            continuation.resume("success")
                        }
                    })
                }
            }
            callBack(result)
        }
    }
}
10178 次点击
所在节点    Android
21 条回复
DiDiz
2021-01-13 10:25:26 +08:00
@xhpan10 也要封装的,封装好了协程代码就和普通同步代码一样。相比之下 rxjava 就显得很啰嗦了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/742640

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX