在Kotlin使用齐射的内存不足

我在Kotlin使用简单的StringRequestVolley进行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.tkMainActivity.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变量