Android Kotlin: проверьте, не является ли представление ненулевым, перед отображением Snackbar - PullRequest
0 голосов
/ 27 апреля 2020

Я использовал следующий код для отображения панели закусок, когда данные были загружены с использованием 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
    }

})

Ответы [ 3 ]

1 голос
/ 27 апреля 2020

Я бы попробовал это. Я только что добавил нулевую проверку

if(view != null){

  // Your code
  val sb = Snackbar.make(view!!, getString(R.string.mytitle), Snackbar.LENGTH_SHORT)
  sb.view.setBackgroundColor(ContextCompat.getColor(context!!, R.color.snackbarGreen))
  sb.show()
}
1 голос
/ 27 апреля 2020

Я бы порекомендовал вам избавиться от оператора двойного взрыва (!!) и использовать оператор null-safety (?) в том месте, где вы используете view !! и context !!.

Вы должны сделать что-то вроде этого:

if(view !=null){
//TODO Snakbar code here.
}

Надеюсь, это поможет.

0 голосов
/ 28 апреля 2020

Вы должны использовать представление, относящееся к вашей активности (так как представления активности не будут уничтожены, если один из ваших фрагментов). Если у вас есть какой-либо экземпляр вида деятельности, передайте его туда.

Или вы можете попробовать это:

val sb = Snackbar.make(activity!!.findViewById(android.R.id.content), getString(R.string.mytitle), Snackbar.LENGTH_SHORT)

здесь я использовал !!, но активность не будет нулевой, если она не уничтожена .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...