尝试在空对象上调用虚拟方法'java.lang.String android.content.Context.getPackageName()'引用新活动



当我试图用这段代码开始新的活动时,我得到了一个错误:

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference

class ApiConnection {
var baseApiURl = "http://localhost:8081"
var data = arrayListOf<User>()
fun connectApi(): ApiService {
val retrofit = Retrofit.Builder()
.baseUrl(baseApiURl)
.addConverterFactory(GsonConverterFactory.create())
.build()
return retrofit.create(ApiService::class.java)
}
fun loginRequest(
login: String,
password: String
){
val service = connectApi()
val call = service.login(login, password)
call.enqueue(object: Callback<UserResponse> {
override fun onFailure(call: Call<UserResponse>?, t: Throwable?) {
Log.v("retrofit", "call failed")
}
override fun onResponse(call: Call<UserResponse>?, response: Response<UserResponse>?) {
addDataToList(response)
}
})
}
fun addDataToList(response: Response<UserResponse>?) {
var mainActivity = MainActivity()
data.add(
User(
response!!.body()!!.idUser,
response!!.body()!!.login,
response!!.body()!!.password,
response!!.body()!!.name,
response!!.body()!!.surname,
response!!.body()!!.lastLogin
)
)
mainActivity.loginIntoServer(data)
}
}

class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val api = ApiConnection()
button_checkIfThisAccountExit_mainActivity.setOnClickListener {
api.loginRequest(editText_login_activityMain.text.toString(), editText_password_mainActivity.text.toString())
}
}

fun loginIntoServer(data: ArrayList<User>) {
val context = this
val intent = Intent(context, Main2Activity::class.java)
startActivity(intent)
}
}

你知道是什么导致了这个错误吗?我使用改装来连接我的API,在解析结果数据并将其添加到列表后,我想运行新的活动(类似于登录系统。在输入用户名/密码后,我想要更改活动(。

问题的来源是var mainActivity = MainActivity(),您永远不会通过调用constructor来创建活动实例,因为这是android系统的工作,请参阅此

解决问题的正确方法是LiveData。但是,如果你想让你的当前代码按原样工作,你必须在你的ApiConnectionclass,中传递一个contextobject

fun addDataToList(context: Context, response: Response<UserResponse>?) {
data.add(
User(
response!!.body()!!.idUser,
response!!.body()!!.login,
response!!.body()!!.password,
response!!.body()!!.name,
response!!.body()!!.surname,
response!!.body()!!.lastLogin
)
)
val intent = Intent(context, Main2Activity::class.java)
context.startActivity(intent)
}

还要更新loginRequest的签名以接受来自activityContext对象,使其看起来如下

fun loginRequest(context: Context, login: String, password: String)

现在把你的活动称为

api.loginRequest((this as Context), editText_login_activityMain.text.toString(), editText_password_mainActivity.text.toString())

您认为这段代码应该是什么样子?如果你知道我的意思,那么只有正确工作的代码对我来说是不够的。我还想拥有看起来不错的代码。

相关内容

  • 没有找到相关文章

最新更新