在Kotlin使用齐射的内存不足
我在Kotlin
使用简单的StringRequest
和Volley
进行OutOfMemoryError
。
令人惊讶的事实(至少对我来说)是我没有做任何有大图像或大数据或类似的东西。
因为我只是测试,所以我使用了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) } }
然后就是使用VolleySingleton.tk
的MainActivity.kt
上的函数
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) }
这是V-master的回答 。 在Kotlin中有延迟初始化的本地支持。
Intead的
var requestQueue: RequestQueue? = null get() { if (requestQueue == null) { requestQueue = Volley.newRequestQueue(applicationContext) } return requestQueue }
应该
val requestQueue by lazy { Volley.newRequestQueue(applicationContext) }
这种方法允许更清晰的代码,删除额外的空检查,确保线程安全(V-主的答案是不是线程安全的),并防止意外设置requestQueue
。
了解更多关于lazy
。
你正在做一件大事:
var requestQueue: RequestQueue? = null get() { if (requestQueue == null) { requestQueue = Volley.newRequestQueue(applicationContext) } return requestQueue }
你正在使用getter函数getter / setter中的getter函数= stackoverflow引用字段值,你应该使用field
变量
var requestQueue: RequestQueue? = null get() { if (field== null) { field= Volley.newRequestQueue(applicationContext) } return field }
来自Kotlin文档 :
Kotlin的课程不能有字段。 但是,使用自定义访问器时有时需要有后台字段。 为了这些目的,Kotlin提供了一个可以使用
field
标识符访问的自动后台字段:
这意味着您正在使用的字段(在Kotlin中称为属性)始终引用backing field
setter / getter,并且只有对该后台字段的访问是通过在getter / setter中使用field
变量