android - 如果在获取 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()
我错过了什么吗?或者也许这是一个与生命周期相关的问题?让我知道是否有任何不清楚的地方。
编辑:根据要求,这是完整的错误日志。
解决方案
例外是因为activity
您在 Toast 中使用的在您回压时变为 null(片段被破坏)但稍后收到 api 响应并执行 toast。
因此,只需在烘烤前添加一个空检查:
if(activity!=null){
Toast.makeText((activity as AppCompatActivity), "Data retrieved!", Toast.LENGTH_SHORT).show()
}
推荐阅读
- kotlin - Kotlin 数据类
- angular - 在多个实例的表中单击时显示加载器
- python - 如何从使用 numpy arange 生成的坐标列表中生成坐标列表(纬度、经度)
- php - PHP - str_replace 在多维数组中不起作用
- android - 在 phpmyadmin 中存储 mp3 的数据库
- unity3d - Unity3d - 分别为精灵/图像的不同部分着色
- c++ - 有没有办法在非模板类中定义模板成员?
- c# - 无法为“ApplicationUser”创建 DbSet,因为此类型未包含在上下文模型中
- c# - 我可以使用 Windows CNG 存储解密 .gpg 文件吗?
- apache-spark - 如何转换数据集
非原始数据类型的列