【发布时间】:2020-08-10 19:20:03
【问题描述】:
我使用以下代码在使用retrofit 加载数据时显示一个快餐栏。
有时,当用户尝试从该片段导航到另一个片段而获取数据的请求尚未终止时,我会收到 NullPointerException:
kotlin.KotlinNullPointerException 在 com.test.data.ui.cars.SiteCarsFragment$getCars$1.onFailure(SiteCarsFragment.kt:279) 在 retrofit2.DefaultCallAdapterFactory$ExecutorCallbackCall$1$2.run(DefaultCallAdapterFactory.java:92) 在 android.os.Handler.handleCallback(Handler.java:883) 在 android.os.Handler.dispatchMessage(Handler.java:100) 在 android.os.Looper.loop(Looper.java:224) 在 android.app.ActivityThread.main(ActivityThread.java:7520) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)
这是因为view 在这种情况下为空。
如何修改代码以确保在显示快餐栏之前定义视图?
// Call getCars() API
val call = App.myService.getCars(site.id!!)
call.enqueue(object : Callback<CarsResponse> {
override fun onResponse(call: Call<CarsResponse>, response: Response<CarsResponse>) {
Log.i(tagLabel, "getCars() - onResponse() Result = ${response.body()}")
if (response.code() == 200) {
if (response.body()?.data?.size == 0){
// do stuff
} else {
val sb = Snackbar.make(view!!, getString(R.string.mytitle), Snackbar.LENGTH_SHORT)
sb.view.setBackgroundColor(ContextCompat.getColor(context!!, R.color.snackbarGreen))
sb.show()
}
}
}
override fun onFailure(call: Call<CarsResponse>, t: Throwable) {
// do stuff
}
})
【问题讨论】:
-
你能显示你从哪里调用这个代码吗?
-
@Rahul 是的,刚刚编辑了我的帖子
-
@wawanopoulos 你能发布错误堆栈跟踪吗
-
尝试放入一个 try-catch 块并创建一个该 throwable 的 Toast。把截图贴在帖子里,让我们看看是什么错误。
-
@wawanopoulos 您从哪里获取此视图并添加此视图?.let{ ...您的代码在这里...}?:Log.e(TAG,“view is null”)保存由于视图而导致的崩溃。