Retrofit 2.0取消Call对象



是否有人玩过Retrofit 2.0,特别是Call.cancel()方法?

什么时候是触发它的最佳时机?我曾尝试在FragmentonStop()中调用它,但遇到了一些问题,当屏幕显示关闭时,呼叫被取消。我还尝试在FragmentonDestroy()中调用它,但此方法不会取消在ViewPager中触发的调用(例如在制表符之间切换)

谁有一个工作的例子吗?

我已经尝试在我的Loop repo中实现这个:https://github.com/lawloretienne/Loop

"正确"的位置很大程度上取决于您的具体用例。正如您所发现的,不可能有放之四海而皆准的解决方案。以下是根据您陈述的需求需要考虑的一些事项:


当屏幕关闭时取消网络请求对你的应用程序来说是一个大问题吗?用户会在期待应用程序继续运行的同时关闭屏幕吗?

    如果没有,您可以安全地使用onStop,正如您已经描述的。
  • 如果是这样,你可以将你的网络请求移动到一个生活在ActivityFragment生命周期之外的类中(例如,使用单例网络请求管理器,或者更多地依赖于Service子类)。然后,您将能够逐个处理取消。例如,您仍然可以随时取消生命周期回调中的请求(通过向管理器发出信号),但是您不会被要求

关于取消由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
        }
    }

相关内容

  • 没有找到相关文章

最新更新