Android 如何在使用navGraph时处理片段中的API调用?

Android 如何在使用navGraph时处理片段中的API调用?,android,navigation,Android,Navigation,我在其中一个项目中使用了导航组件,该项目具有底部导航视图和三个菜单项(例如home、profile和about)。我的应用程序的登录页是home片段(例如),在这里调用一个API(在onCreateView()方法中)来获取用户列表;它工作正常,但每当用户导航到其他页面(如概要文件)并返回时,意味着API会再次在主片段中被调用 我将此链接转介至: class-Home:Fragment(){ 覆盖创建视图(充气机:布局充气机,容器:视图组?, savedInstanceState:捆绑?:查看{

我在其中一个项目中使用了导航组件,该项目具有底部导航视图和三个菜单项(例如home、profile和about)。我的应用程序的登录页是home片段(例如),在这里调用一个API(在onCreateView()方法中)来获取用户列表;它工作正常,但每当用户导航到其他页面(如概要文件)并返回时,意味着API会再次在主片段中被调用

我将此链接转介至:

class-Home:Fragment(){
覆盖创建视图(充气机:布局充气机,容器:视图组?,
savedInstanceState:捆绑?:查看{
//为该碎片膨胀布局
val视图=充气机。充气(R.layout.fragment\u home,container,false)
view.findviewbyd(R.id.signup\u btn).setOnClickListener{
findNavController().导航(R.id.action\u home\u to\u注册)
}
CalluerListapi()
返回视图
}
私人娱乐网站serlistapi(){
val client=ServiceGenerator.getApiService(requireContext()).getJsonbyWholeUrl(“http://dummy.restapiexample.com/api/v1/employees")
enqueue(对象:回调{
覆盖失效时的乐趣(调用:调用,t:可丢弃){
println(“callUserListApi onFailure${t.message}”)
}
覆盖fun onResponse(调用:调用,响应:响应){
println(“callUserListApi onResponse${response.issusccessful}”)
}
})
}
}

使用导航组件,每次在导航中选择片段时都会重新创建片段,这意味着调用onCreateView(),其中包括您的callUserListApi()

因为您使用的是AAC,所以可以在活动上创建一个ViewModel并对其进行初始化,然后从主页(片段)重新初始化它。添加一个MutableLiveData()变量,您可以检查该变量是否已读取callUserListApi()

别忘了在activitycreated()中调用它

在家里

 override fun onActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)

    mainActivityViewModel.calledUserList.observe(viewLifecycleOwner, Observer {


        if(it != true) {
           callUserListApi()
        }

     })

}

private fun callUserListApi() {
      val client = ServiceGenerator.getApiService(requireContext()).getJsonbyWholeUrl("http://dummy.restapiexample.com/api/v1/employees")
    client.enqueue(object : Callback<JsonArray> {
        override fun onFailure(call: Call<JsonArray>, t: Throwable) {
            println("callUserListApi onFailure ${t.message}")
        }

        override fun onResponse(call: Call<JsonArray>, response: Response<JsonArray>){
            println("callUserListApi onResponse ${response.isSuccessful}")
            mainActivityViewModel.setCalledUserList(true)
        }
    })
}
覆盖活动创建的乐趣(savedInstanceState:Bundle?){
super.onActivityCreated(savedInstanceState)
mainActivityViewModel.calledUserList.observe(viewLifecycleOwner,Observer{
如果(it!=true){
CalluerListapi()
}
})
}
私人娱乐网站serlistapi(){
val client=ServiceGenerator.getApiService(requireContext()).getJsonbyWholeUrl(“http://dummy.restapiexample.com/api/v1/employees")
enqueue(对象:回调{
覆盖失效时的乐趣(调用:调用,t:可丢弃){
println(“callUserListApi onFailure${t.message}”)
}
覆盖fun onResponse(调用:调用,响应:响应){
println(“callUserListApi onResponse${response.issusccessful}”)
mainActivityViewModel.setCalledUserList(true)
}
})
}
在youre Main活动视图模型中

val _calledUserList = MutableLiveData<Boolean?>()
val calledUserList = _calledUserList

fun setCalledUserList(bool: Boolean?) {
    _calledUserList.value = bool
}
val\u calledUserList=MutableLiveData()
val calledUserList=_calledUserList
有趣的setCalledUserList(bool:Boolean?){
_calledUserList.value=bool
}

使用导航组件每次选择选项卡时都会重新创建片段。所以在这里,我膨胀了片段,若我的视图为空,那个么当返回到那个些片段时,视图不是空的,所以片段不应该重新创建

 private var homeFragment: View? = null

 override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    if (view == null){
        homeFragment = inflater.inflate(R.layout.fragment_home, container, false)
        callUserListApi()
    }

    return view
}   

您可能还想解释OP做错了什么。
 private var homeFragment: View? = null

 override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    if (view == null){
        homeFragment = inflater.inflate(R.layout.fragment_home, container, false)
        callUserListApi()
    }

    return view
}