Android MVP - 重用多个片段的共享数据

时间:2018-01-29 08:39:36

标签: android android-fragments mvp

我正在使用MVP构建Android应用程序。 其中一个屏幕以某种主/明细视图(嵌入播放器的内容页面)显示数据:

mockup

在顶部,有播放器(片段),下面是内容信息(带有片段的viewpager),用户可以在页面之间滑动(ViewPager)以在内容之间切换。当Viewpager位置发生变化时,播放器会相应更新并开始播放当前内容。

演示者请求的数据来自存储库,具有本地(数据库)/远程(Rest API)数据源。

如何充分利用MVP避免多次请求相同的数据?

我的Activity中是否只有一个Presenter,并且在某处保留/缓存内容信息信息请求的数据,并在位置发生变化时将其传递给播放器?

或者,为每个ContentInfo设置一个演示者,请求自己的数据和播放器的演示者,在调用play()方法时再次请求相同的数据是否更好?

我找到了this相关主题,但它并不适合我的情况,因为在内容信息片段中请求的同时数据未在播放器中更新(I& #39;通过ViewPager获取片段的创建数据,以便在完成滑动时已经加载它。)

2 个答案:

答案 0 :(得分:1)

最好的方法是让各个组件从存储库请求数据,并在存储库级别处理缓存。

当ViewPager的内容发生变化时,只需通知播放器有关新内容的ID。然后播放器将从存储库中获取此内容。存储库"知道"此内容已经下载并从数据库而不是Web提供。

如果数据库速度不够快,可以在存储库中实现内存中缓存。

答案 1 :(得分:1)

您可以将[Parse initializeWithConfiguration:[ParseClientConfiguration configurationWithBlock:^(id<ParseMutableClientConfiguration> configuration) { configuration.applicationId = PARSE_APP_ID; configuration.clientKey = PARSE_CLIENT_KEY; configuration.server = PARSE_SERVER_URL; configuration.networkRetryAttempts = 10; }]]; Fragment一起用作数据片段。 setRetainInstance(true)控制是否在重新创建活动时保留片段实例(例如来自配置更改)。

此处的数据片段示例:

setRetainInstance

假设活动类名为public class MyDataFragment extends Fragment { public static MyDataFragment newInstance() { return new MyDataFragment(); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Retain this instance so it isn't destroyed when MainActivity and MainFragment change configuration. setRetainInstance(true); } // Add any data you want to share across multiple fragments of same activity here public String myData = null; }

MyActivity

然后在public class MyActivity extends AppCompatActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); .... // Build up a common data fragment to be used by multiple child view pager fragments. final FragmentManager fm = getSupportFragmentManager(); MyDataFragment myDataFragment = (MyDataFragment)fm.findFragmentByTag(MY_DATA_FRAGMENT); if (myDataFragment == null) { MyDataFragment dataFragment = MyDataFragment.newInstance(); fm.beginTransaction().add(dataFragment, MY_DATA_FRAGMENT).commit(); } ..... } .... public static final String MY_DATA_FRAGMENT = "MY_DATA_FRAGMENT"; player fragment中,访问数据片段,如下所示:

viewpager fragment

希望这有帮助,祝你好运!