为什么RequireView()为什么不在onResume()上返回视图?

问题描述 投票:0回答:1

我正在用片段的onResume()方法上的Volley Request解析数据,用解析后的数据填充布局,我需要获取片段的视图,这就是为什么我在requireReview()上调用requireView()的原因)在成功解析之后。现在,我的应用程序第一次崩溃在一行上,我会用*标记:

java.lang.IllegalStateException:片段DataMain {1a53f20}(4f68cb4d-c05f-4416-932e-26e455fbf106)}从以下位置未返回视图onCreateView()或在onCreateView()之前调用它。

这是代码:

class DataMain : Fragment(), CoroutineScope by MainScope() {

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                              savedInstanceState: Bundle?): View? {
        val view = inflater.inflate(R.layout.fragment_Data, container, false)
        DataBalance = view.findViewById(R.id.Data_balance)
        // Firebase User Auth
        getUID.requestUidToken()?.addOnSuccessListener { 

                    }?.addOnFailureListener {

                    val unregisteredView = inflater.inflate(R.layout.fragment_unregistred, container, false)
                    val registerNow = unregisteredView.findViewById<TextView>(R.id.textview_registernow)
                    registerNow.setOnClickListener {
                        val mIntent = Intent(activity, LoginMain::class.java)
                        requireActivity().startActivity(mIntent)
                    }
                }
            view
        } else {
            val unregisteredView = inflater.inflate(R.layout.fragment_unregistred, container, false)
            val registerNow = unregisteredView.findViewById<TextView>(R.id.textview_registernow)
            registerNow.setOnClickListener {
                val mIntent = Intent(activity, LoginMain::class.java)
                requireActivity().startActivity(mIntent)
            }
            unregisteredView
        }
    }

        private fun populateDataLayout(res: JSONObject, view: View) {
        val response = Gson().fromJson(res.toString(), ServerResponse::class.java)
        //here I need the view
        val lVDataMenu: ListView = view.findViewById(R.id.lV_DataMenu)
        lVDataMenu.adapter = lVadapter

        else if (response.code == 403) {

        }
}


    override fun onResume() {
        getUID.requestUidToken()?.addOnSuccessListener { getTokenResult ->
            Volley(config.DATA_LOADDATA, { res ->
                **CRASH**populateDataLayout(res,requireView())
            }, {
                tv_unverified.visibility = View.VISIBLE
            })
        }
        super.onResume()
    }

我可以在填充的例程中摆脱对“ view.findViewById(R.id.lV_DataMenu)”的使用,但是我在这里不明白问题所在。我无法重新创建该错误,所以这就是为什么我要问。那么,为什么requireView()不返回View?是因为用户在Volley尚未完成解析时切换到下一个片段吗?我该如何解决?

android android-fragments kotlin view android-view
1个回答
1
投票
override fun onResume() {
    getUID.requestUidToken()?.addOnSuccessListener { getTokenResult ->
        Volley(config.DATA_LOADDATA, { res ->
            **CRASH**populateDataLayout(res,requireView())
        }, {
            tv_unverified.visibility = View.VISIBLE
        })
    }

您不在这里的requireView()中呼叫onResume()

您有两个异步调用,并且正在将它们作为参数传递给函数({}中的那些lambda表达式)。这些功能稍后被调用。异步操作完成时。到那时,您的片段可能已经结束了其生命周期。

处理它的两种常用策略:

  1. 当片段结束时,取消您的未决异步调用。您似乎触发了onCreateView()onResume()中的呼叫。这些的生命周期对应对象为onDestroyView()onPause()。具体如何执行此操作取决于您使用的异步API。

  2. 使用陈旧性检查即付即用:异步完成后,请检查该片段是否仍然存在,否则不执行任何操作。例如,更改

    populateDataLayout(res,requireView())
    

    类似

    view?.let { populateataLayout(res, it) }
    

    其中view是非空getView()的可为空的requireView()对应项。

© www.soinside.com 2019 - 2024. All rights reserved.