首页 > 解决方案 > 如果在获取 API 期间按下后退按钮,Kotlin 应用程序崩溃

问题描述

所以我有一个问题,如果在片段中获取服务期间按下后退按钮,应用程序将崩溃。目前我正在使用改造库来执行服务调用任务。以下是片段的代码片段:

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
}

如果按下后退按钮,它将崩溃并返回错误

kotlin.TypeCastException:null 不能转换为非 null 类型 androidx.appcompat.app.AppCompatActivity

在下面的行中指出的错误OnResponse()

Toast.makeText((activity as AppCompatActivity), "Data retrieved!", Toast.LENGTH_SHORT).show()

我错过了什么吗?或者也许这是一个与生命周期相关的问题?让我知道是否有任何不清楚的地方。

编辑:根据要求,这是完整的错误日志。

在此处输入图像描述

标签: androidkotlinretrofit

解决方案


例外是因为activity您在 Toast 中使用的在您回压时变为 null(片段被破坏)但稍后收到 api 响应并执行 toast。

因此,只需在烘烤前添加一个空检查:

if(activity!=null){
    Toast.makeText((activity as AppCompatActivity), "Data retrieved!", Toast.LENGTH_SHORT).show()
}

推荐阅读