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