我在OutOfMemoryError
中使用StringRequest
Volley
来获取Kotlin
。
令人惊讶的事实(至少对我来说)是我没有做任何关于巨大图像或大数据或类似事情的事情。
由于我只是在测试,我已经使用Volley来调用公共天气API,我肯定知道(在Postman
中检查)只返回一个简单的JSON。
我怎么可能得到OutOfMemoryError
为了实现Volley电话,我实施了一个可能不正确的VolleySingleton
,不确定。我将在此发布所有相关代码:
---> VolleySingleton.kt
object VolleySingleton : Application(){
var requestQueue: RequestQueue? = null
get() {
if (requestQueue == null) {
requestQueue = Volley.newRequestQueue(applicationContext)
}
return requestQueue
}
fun <T> addToRequestQueue(request: Request<T>) {
requestQueue?.add(request)
}
}
然后只是使用MainActivity.kt
VolleySingleton.tk
上的函数
fun callWeatherAPI(){
val request = StringRequest(Request.Method.GET,url,
Response.Listener { response ->
Log.d("API","RESPONSE: "+response)
},
Response.ErrorListener { error ->
Log.d("API","ERROR: "+error)
})
VolleySingleton.addToRequestQueue(request)
}
答案 0 :(得分:2)
这是对V-master's answer的回复。在Kotlin中存在对惰性初始化的本机支持。
的Intead
var requestQueue: RequestQueue? = null
get() {
if (requestQueue == null) {
requestQueue = Volley.newRequestQueue(applicationContext)
}
return requestQueue
}
应该是
val requestQueue by lazy { Volley.newRequestQueue(applicationContext) }
这种方法允许更清晰的代码,删除额外的空值检查,确保线程安全(V-master的答案不是线程安全的)并防止意外设置requestQueue
。
详细了解lazy
。
答案 1 :(得分:1)
你做的很重要:
var requestQueue: RequestQueue? = null
get() {
if (requestQueue == null) {
requestQueue = Volley.newRequestQueue(applicationContext)
}
return requestQueue
}
你在getter函数中使用getter = stackoverflow
在getter / setter中引用字段值,你应该使用field
变量
var requestQueue: RequestQueue? = null
get() {
if (field== null) {
field= Volley.newRequestQueue(applicationContext)
}
return field
}
Kotlin中的类不能有字段。但是,有时在使用自定义访问器时需要有一个支持字段。出于这些目的,Kotlin提供了一个自动支持字段,可以使用
field
标识符访问:
这意味着您正在使用的字段(在Kotlin中称为属性)始终引用backing field
的setter / getter,并且只能通过在getter / setter中使用field
变量来访问该支持字段