如果在获取期间按下后退按钮,Kotlin 应用程序会崩溃 API

Kotlin App Crash if back button pressed during fetching API

所以我有一个问题,如果在片段中获取服务期间按下后退按钮,应用程序会崩溃。目前我正在使用 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
}

如果按下后退按钮,它会崩溃并且return错误

kotlin.TypeCastException: null cannot be cast to non-null type androidx.appcompat.app.AppCompatActivity

OnResponse()

下一行指出的错误

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

我错过了什么吗?或者这可能是一个与生命周期相关的问题?如果有任何不清楚的地方,请告诉我。

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

异常是因为你在Toast中使用的activity当你回按(fragment被销毁)时变为null但是稍后收到api响应并执行toast。

所以在烘烤之前添加一个空检查:

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

如果您的片段是 isAdded,您应该只处理片段中的响应。

当您退出 activity 时,上下文是 null 你可以使用 applicationContext

  Toast.makeText(applicationContext, "Data retrieved!", Toast.LENGTH_SHORT).show()