首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在使用navGraph时处理分片的API调用?

如何在使用navGraph时处理分片的API调用?
EN

Stack Overflow用户
提问于 2019-11-27 16:07:46
回答 2查看 58关注 0票数 1

我在一个项目中使用导航组件,该项目具有三个菜单项(例如主页、配置文件和关于)的底部导航视图。我的应用程序的登录页面是主页片段(例如),其中一个API被调用(在onCreateView()方法中)来获取用户列表;它工作得很好,但只要用户导航到其他页面,比如配置文件并返回,就意味着API再次在主页片段中被调用。

我引用了这个链接- https://github.com/googlesamples/android-architecture-components.git

代码语言:javascript
复制
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}")
            }
        })
    }
}
EN

回答 2

Stack Overflow用户

发布于 2019-11-27 17:22:02

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

代码语言:javascript
复制
 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
}   
票数 1
EN

Stack Overflow用户

发布于 2019-11-27 16:42:03

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

由于您正在使用AAC,您可以在您的活动上创建一个ViewModel并对其进行初始化,然后从主页(片段)重新对其进行初始化。添加一个MutableLiveData()变量,您可以检查是否已经调用了callUserListApi()。

别忘了在onActivityCreated()内部调用它

浅谈家

代码语言:javascript
复制
 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

代码语言:javascript
复制
val _calledUserList = MutableLiveData<Boolean?>()
val calledUserList = _calledUserList

fun setCalledUserList(bool: Boolean?) {
    _calledUserList.value = bool
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59065694

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档