【问题标题】:How to delay second fragment until the first loads the data in ViewPager?如何延迟第二个片段,直到第一个在 ViewPager 中加载数据?
【发布时间】: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


【解决方案1】:

接口的替代方案是用于片段之间通信的共享视图模型(还有其他方法),例如参见androidwave.com/fragment-communication-using-viewmodel

然后您将在 Fragment1 的 LiveData 观察者的 onChanged 中的共享视图模型中设置一个标志,然后在 Fragment2 中在共享视图模型中观察此标志,并且在处于正确状态之前不会 registerLiveDataObservers(); Fragment1 已加载它的数据(数据大小 > 0)

【讨论】:

    【解决方案2】:

    快速修复:我使用 runnable 来延迟在我的第二个片段中注册观察者。我确信有更好的解决方案,所以我不会接受这个。

    final Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
          registerLiveDataObservers();
            }
        }, 2000);  //delay for 2 seconds
    

    我使用实时数据作为改造响应,因此它可以很好地与 db+network 配合使用

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多