当我试图用这段代码开始新的活动时,我得到了一个错误:
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
,中传递一个context
object
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
的签名以接受来自activity
的Context
对象,使其看起来如下
fun loginRequest(context: Context, login: String, password: String)
现在把你的活动称为
api.loginRequest((this as Context), editText_login_activityMain.text.toString(), editText_password_mainActivity.text.toString())
您认为这段代码应该是什么样子?如果你知道我的意思,那么只有正确工作的代码对我来说是不够的。我还想拥有看起来不错的代码。