我正在使用MVP构建Android应用程序。 其中一个屏幕以某种主/明细视图(嵌入播放器的内容页面)显示数据:
在顶部,有播放器(片段),下面是内容信息(带有片段的viewpager),用户可以在页面之间滑动(ViewPager)以在内容之间切换。当Viewpager位置发生变化时,播放器会相应更新并开始播放当前内容。
演示者请求的数据来自存储库,具有本地(数据库)/远程(Rest API)数据源。
如何充分利用MVP避免多次请求相同的数据?
我的Activity中是否只有一个Presenter,并且在某处保留/缓存内容信息信息请求的数据,并在位置发生变化时将其传递给播放器?
或者,为每个ContentInfo设置一个演示者,请求自己的数据和播放器的演示者,在调用play()方法时再次请求相同的数据是否更好?
我找到了this相关主题,但它并不适合我的情况,因为在内容信息片段中请求的同时数据未在播放器中更新(I& #39;通过ViewPager获取片段的创建数据,以便在完成滑动时已经加载它。)
答案 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
希望这有帮助,祝你好运!