在Kotlin使用Volley的记忆力不足

时间:2017-10-13 06:12:42

标签: out-of-memory kotlin android-volley

我在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)
        }

2 个答案:

答案 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
    }

from Kotlin documentation

  

Kotlin中的类不能有字段。但是,有时在使用自定义访问器时需要有一个支持字段。出于这些目的,Kotlin提供了一个自动支持字段,可以使用field标识符访问:

这意味着您正在使用的字段(在Kotlin中称为属性)始终引用backing field的setter / getter,并且只能通过在getter / setter中使用field变量来访问该支持字段