【发布时间】:2020-07-02 19:55:14
【问题描述】:
我在视图寻呼机中有 2 个片段。它们都开始同时发出网络请求。我想通过延迟第二个片段来加速第一个片段,直到第一个片段加载数据。我该怎么做?我在java中编码。
编辑: 当两个片段加载数据时,与我仅使用第一个片段(测试时)发出网络请求时相比,完成加载第一个片段需要额外的 2 秒,因为视图寻呼机同时加载两个选项卡。
编辑2: 发现同样的问题:link 一个答案建议为第一个片段创建接口。
interface TabView {
fun prepareTab()
fun onTabOpened()
fun onTabClosed()
}
问题是我无法使用接口,因为我的第一个选项卡使用了我在此处找到的示例中的根片段:link
Edit3:我在第二个片段中的网络请求:Implementation of network bound resource
【问题讨论】:
-
您可以轻松地延迟第二个片段的网络请求,直到第二个片段可见,如果这是您所追求的?或者,如果您想在完成第一组网络请求后立即开始第二组网络请求,您可能希望将加载的数据从片段中分离到类似 ViewModel 的东西中。
-
ViewPager默认加载最多 3 个片段:一个当前显示的片段,如果有,则在显示片段的每一侧都有一个片段。所以只给两个片段,你的第二个片段每次都会加载。您将必须实施您的自定义解决方案以避免触发两个片段网络调用。考虑使用ViewPager.OnPageChangeListener来确定显示哪个片段并决定哪个片段应该触发其网络调用。 -
你可以通过他们持有
ViewPager的activity/fragment来做到这一点,你可以在activity实现的第一个fragment中设置监听器,当fragment加载数据时,回调被调用Activity,此时Activity可以触发第二个fragment网络请求 -
@Andrew 我已经为每个片段使用单独的视图模型和存储库来获取数据,将其插入数据库,然后实时数据观察者触发 ui 更改。我不想在第二个片段中启动网络请求它是可见的(当用户滑动到选项卡 2 时),因为这将是糟糕的用户体验,用户将需要再等待几秒钟......
-
接口的替代方案是共享视图模型,用于在片段之间进行通信(还有其他方法),例如参见androidwave.com/fragment-communication-using-viewmodel。然后你在 Fragment1 的
onChanged中的共享视图模型中设置一个标志,然后 Fragment2 在共享视图模型中观察这个标志并且不会registerLiveDataObservers();直到处于正确的状态,说 Fragment1 已经加载了它的数据(数据有大小> 0 ) PS 链接到您已删除的代码对理解您的问题非常有帮助
标签: android performance android-fragments android-viewpager