Я использовал следующий код для отображения панели закусок, когда данные были загружены с использованием 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 (Обработчик. java: 883) в android .os.Handler.dispatchMessage (Обработчик. java) : 100) в android .os.Looper.l oop (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
}
})