问一个关于 kotlin 协程 lifecycleScope 用法和内存泄漏的问题。
資深大佬 : m30102 1
在随便一个 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) } } }
大佬有話說 (19)