有没有人玩过Retrofit 2.0,特别是Call.cancel()方法?
什么时候触发它的最佳时机?我尝试过调用它,onStop()
但Fragment
遇到了一些问题,即在屏幕显示关闭时取消调用。我也尝试在onDestroy()
a中调用它,Fragment
但此方法不会取消在 a 中触发的调用ViewPager
(例如在选项卡之间切换)
有没有人有这方面的工作示例?
我试图实现这个我的循环回购: https ://github.com/lawloretienne/Loop
有没有人玩过Retrofit 2.0,特别是Call.cancel()方法?
什么时候触发它的最佳时机?我尝试过调用它,onStop()
但Fragment
遇到了一些问题,即在屏幕显示关闭时取消调用。我也尝试在onDestroy()
a中调用它,Fragment
但此方法不会取消在 a 中触发的调用ViewPager
(例如在选项卡之间切换)
有没有人有这方面的工作示例?
我试图实现这个我的循环回购: https ://github.com/lawloretienne/Loop
“正确”的位置在很大程度上取决于您的特定用例。正如您所发现的,不可能有一个万能的解决方案。根据您提出的需求,需要考虑以下几点:
屏幕关闭时取消网络请求对您的应用程序来说是一个大问题吗?用户是否可能会在期望应用程序继续运行时关闭屏幕?
onStop
,正如您已经描述的那样。Activity
(Fragment
例如,使用单例网络请求管理器,或者更多地依赖Service
子类)。然后,您将能够根据具体情况处理取消。例如,您仍然可以随时取消生命周期回调中的请求(通过向管理器发出信号),但您不需要这样做。关于取消由Fragments
in触发的网络请求ViewPager
,您可能希望实现自己的虚假生命周期方法。这是我用过几次的好模式。要点如下:
Fragments
使用ViewPager
一个接口,该接口包含您关心的生命周期方法的“假”版本。例子:
public interface FragmentLifecycle {
public void onStartFragment();
public void onStopFragment();
}
OnPageChangeListener
在您的, 上设置一个ViewPager
,并跟踪其中的当前页面。每当页面发生变化时,调用传入/传出片段的适当方法。例子:
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
}
}