在随便一个 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)
}
}
}
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.