我在一个项目中使用导航组件,该项目具有三个菜单项(例如主页、配置文件和关于)的底部导航视图。我的应用程序的登录页面是主页片段(例如),其中一个API被调用(在onCreateView()方法中)来获取用户列表;它工作得很好,但只要用户导航到其他页面,比如配置文件并返回,就意味着API再次在主页片段中被调用。
我引用了这个链接- https://github.com/googlesamples/android-architecture-components.git
class Home : Fragment() {
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
// Inflate the layout for this fragment
val view = inflater.inflate(R.layout.fragment_home, container, false)
view.findViewById<Button>(R.id.signup_btn).setOnClickListener {
findNavController().navigate(R.id.action_home_to_registered)
}
callUserListApi()
return view
}
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}")
}
})
}
}发布于 2019-11-27 17:22:02
使用导航组件,每次选择选项卡时都会重新创建片段。所以这里我已经膨胀了片段,如果我视图是空的,当返回到那些片段时,视图不是空的,所以片段不应该被重新创建。
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
} 发布于 2019-11-27 16:42:03
使用导航组件,每次在导航上选择它时都会重新创建片段,这意味着调用包含您的callUserListApi()的onCreateView()。
由于您正在使用AAC,您可以在您的活动上创建一个ViewModel并对其进行初始化,然后从主页(片段)重新对其进行初始化。添加一个MutableLiveData()变量,您可以检查是否已经调用了callUserListApi()。
别忘了在onActivityCreated()内部调用它
浅谈家
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)
}
})
}你的内心是MainActivityViewModel
val _calledUserList = MutableLiveData<Boolean?>()
val calledUserList = _calledUserList
fun setCalledUserList(bool: Boolean?) {
_calledUserList.value = bool
}https://stackoverflow.com/questions/59065694
复制相似问题