Kotlin App Cra sh если во время загрузки API нажата кнопка возврата - PullRequest
0 голосов
/ 30 мая 2020

Итак, у меня есть проблема, что приложение будет сканировать sh, если кнопка «Назад» нажата во время извлечения службы во фрагменте. В настоящее время я использую Retrofit Library для выполнения задач по вызову сервисов. Ниже приведен фрагмент кода фрагмента:

ProductStockOutletListFragment.kt

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {

    (activity as AppCompatActivity).supportActionBar?.title = "Product List"

    binding = DataBindingUtil.inflate(inflater, R.layout.fragment_product_stock_outlet_list, container, false)

    //Show Progressbar While loading data
    binding.progressBar.visibility = View.VISIBLE

    //Apply layout manager
    binding.rvOutletList.layoutManager = LinearLayoutManager((activity as AppCompatActivity))

    NetworkConfig().getOutletListService()
        .getOutlets()
        .enqueue(object : Callback<OutletListPOJODataClasses> {

            override fun onFailure(call: Call<OutletListPOJODataClasses>, t: Throwable) {

                if(call.isCanceled){
                    Toast.makeText((activity as AppCompatActivity), "Request Aborted", Toast.LENGTH_SHORT).show()
                }else{
                    Toast.makeText((activity as AppCompatActivity), t.localizedMessage, Toast.LENGTH_SHORT).show()
                }

            }

            override fun onResponse(
                call: Call<OutletListPOJODataClasses>,
                response: Response<OutletListPOJODataClasses>
            ) {
                binding.progressBar.visibility = View.GONE
                binding.rvOutletList.adapter = response.body()?.let { OutletListAdapter(it, this@ProductStockOutletListFragment) }

                Toast.makeText((activity as AppCompatActivity), "Data retrieved!", Toast.LENGTH_SHORT).show() //It points out this line. This is where the error happened.
            }

        })

    // Declare that this fragment has menu
    setHasOptionsMenu(true)

    // Set action bar title to "Outlet List"
    (activity as AppCompatActivity).supportActionBar?.title = "Outlet List"

    return binding.root
}

Если нажать кнопку «Назад», он выдаст sh и вернет ошибку.

kotlin .TypeCastException: null не может быть приведен к ненулевому типу androidx.appcompat.app.AppCompatActivity

Ошибка, указанная в строке ниже в OnResponse()

Toast.makeText ((активность как AppCompatActivity), «Данные получены!», Toast.LENGTH_SHORT) .show ()

Я что-то упустил? Или, может быть, это проблема жизненного цикла? Дайте мне знать, если что-то неясно.

Изменить: По запросу, это полный журнал ошибок.

enter image description here

Ответы [ 3 ]

1 голос
/ 30 мая 2020

Исключение состоит в том, что activity, который вы использовали в Toast, становится нулевым при обратном нажатии (фрагмент уничтожается), но ответ api получен позже и тост выполняется.

Так что просто добавьте нулевую проверку перед тостом:

if(activity!=null){
    Toast.makeText((activity as AppCompatActivity), "Data retrieved!", Toast.LENGTH_SHORT).show()
}
0 голосов
/ 30 мая 2020

Когда вы выходите из действия, контекст равен null, вы можете использовать applicationContext

  Toast.makeText(applicationContext, "Data retrieved!", Toast.LENGTH_SHORT).show()
0 голосов
/ 30 мая 2020

Вы должны обрабатывать ответ в своем фрагменте, только если ваш фрагмент isAdded.

...