是否有人玩过Retrofit 2.0,特别是Call.cancel()方法?
什么时候是触发它的最佳时机?我曾尝试在Fragment
的onStop()
中调用它,但遇到了一些问题,当屏幕显示关闭时,呼叫被取消。我还尝试在Fragment
的onDestroy()
中调用它,但此方法不会取消在ViewPager
中触发的调用(例如在制表符之间切换)
谁有一个工作的例子吗?
我已经尝试在我的Loop repo中实现这个:https://github.com/lawloretienne/Loop
"正确"的位置很大程度上取决于您的具体用例。正如您所发现的,不可能有放之四海而皆准的解决方案。以下是根据您陈述的需求需要考虑的一些事项:
当屏幕关闭时取消网络请求对你的应用程序来说是一个大问题吗?用户会在期待应用程序继续运行的同时关闭屏幕吗?
- 如果没有,您可以安全地使用
- 如果是这样,你可以将你的网络请求移动到一个生活在
Activity
和Fragment
生命周期之外的类中(例如,使用单例网络请求管理器,或者更多地依赖于Service
子类)。然后,您将能够逐个处理取消。例如,您仍然可以随时取消生命周期回调中的请求(通过向管理器发出信号),但是您不会被要求。
onStop
,正如您已经描述的。关于取消由ViewPager
中的Fragments
触发的网络请求,您可能希望实现自己的人工生命周期方法。这是我用过几次的一个很好的模式。要点如下:
- 让
ViewPager
使用的所有Fragments
实现一个包含"假"版本的生命周期方法的接口。
的例子:
public interface FragmentLifecycle {
public void onStartFragment();
public void onStopFragment();
}
- 在
ViewPager
上设置OnPageChangeListener
,并在其中跟踪当前页面。当页面发生变化时,在传入/传出片段上调用相应的方法。
的例子:
private OnPageChangeListener pageChangeListener = new OnPageChangeListener() {
int currentPosition = 0;
@Override
public void onPageSelected(int newPosition) {
final FragmentLifecycle fragmentToShow = (FragmentLifecycle) pageAdapter.getItem(newPosition);
fragmentToShow.onStartFragment();
final FragmentLifecycle fragmentToHide = (FragmentLifecycle)pageAdapter.getItem(currentPosition);
// Cancel network requests inside this callback. It
// corresponds to the current page moving off-screen.
fragmentToHide.onStopFragment();
currentPosition = newPosition;
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
// no-op
}
public void onPageScrollStateChanged(int arg0) {
// no-op
}
};
(我更新了链接的示例以使用onStart
/onStop
,因为您已经在问题中提到了生命周期对。)
希望这能给你一些关于如何最好地使用Retrofit 2中的新取消功能的想法!让我们知道你想到了什么
您尝试过UserVisibleHint吗?
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
// fragment visible to user
}else{
// fragment invisible
// you can call Call.cancel() here
}
}