Volley newRequestQueue 'android.content.Context android.content.Context.getApplicationContext()' o


public final fun sendDeviceToken() {
FirebaseMessaging.getInstance().token.addOnCompleteListener {
if (!it.isSuccessful) {
return@addOnCompleteListener
}
val token = it.result //this is the token retrieved
val queue = Volley.newRequestQueue(this)
val url = "https://example.com"
val requestBody = "token=$token"
val stringReq : StringRequest =
object : StringRequest(Method.POST, url,
Response.Listener { response ->
// response
var strResp = response.toString()
Log.d("API", strResp)
},
Response.ErrorListener { error ->
Log.d("API", "error => $error")
}
){
override fun getBody(): ByteArray {
return requestBody.toByteArray(Charset.defaultCharset())
}
}
queue.add(stringReq)
}
}

我是Kotlin的新手,试图将devicetoken发送到服务器当我调用MainActivity().sendDeviceToken()函数时,我得到Attempt to invoke virtual method 'android.content.Context android.content.Context.getApplicationContext()' on a null object reference

如何将上下文传递给newRequestQueue?

查看完整的代码https://codefile.io/f/uhfe84zzxexSDBp1GBSG

活动只有在系统创建它们时才有Context,并且它们已经达到了它们生命周期的CREATED状态(即onCreate已经被调用)。因此,一旦处于CREATED状态,您只能使用Activity作为Context(就像在newRequestQueue(this)调用中一样)。

是系统处理一个Activity的创建,设置和回调,使其作为一个Activity组件工作。没有这些,它只是一个普通的对象——如果你自己用MainActivity()构造一个对象,你就只能得到这些了。由于活动的有用性是它如何与系统交互的,所以基本上没有理由自己构建一个活动,因为它不会真正"工作"。

如果你想在活动之外使用该方法,添加一个Context参数并在你的newRequestQueue调用中使用它。

public final fun sendDeviceToken(context: Context) {
...
val queue = Volley.newRequestQueue(context)

然后从你可以访问Context的地方调用它。理想情况下,如果你真的不从ActivityFragment中调用这个方法,它就不应该在Activity类中——你不需要专门构造一个来调用这个方法,基本上。

相关内容

最新更新