Retrofit 2.0取消Call对象

too*_*o42 15 api android request-cancelling retrofit2

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

什么时候触发它的最佳时机?我曾试着打电话给它onStop()Fragment,但遇到了与调用一些问题的时候,屏幕显示被关闭被取消.我也试着给它onDestroy()Fragment,但是这种方法不会取消获得的触发呼叫ViewPager(例如标签之间的切换)

有没有人有这方面的实例?

我试图实现这个我的Loop repo:https: //github.com/lawloretienne/Loop

stk*_*ent 11

"正确"的地方在很大程度上取决于您的具体用例.正如您所发现的那样,不可能有一个通用的解决方案.根据您的陈述需求,可以考虑以下几点:


屏幕关闭时取消网络请求对您的应用程序来说是一个大问题?用户是否可能在期望应用继续运行时关闭屏幕?

  • 如果没有,onStop正如您已经描述的那样,您可以安全使用.
  • 如果是这样,您可以将您的网络请求到外面居住类ActivityFragment(使用一个单独的网络请求管理器,或更多地依靠例如生命周期Service的子类).然后,您将能够根据具体情况处理取消.例如,您仍然可以随时取消生命周期回调中的请求(通过向管理器发送信号),但您不需要这样做.

关于取消Fragmentsa中触发的网络请求ViewPager,您可能希望实现自己的虚假生命周期方法.这是我用了几次的好模式.要点如下:

  • 实现所Fragments使用的所有ViewPager接口都包含您关注的生命周期方法的"假"版本.

例:

public interface FragmentLifecycle {
    public void onStartFragment();
    public void onStopFragment();
}
Run Code Online (Sandbox Code Playgroud)
  • 设置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
    }
};
Run Code Online (Sandbox Code Playgroud)

(我更新了链接的示例以使用onStart/,onStop因为您已经在问题中提到了生命周期对.)

希望这能为您提供一些关于如何最好地使用Retrofit 2中的新取消功能的想法!让我们知道你想出了什么.

  • 与此同时,我在`AsyncTask`中包装`Call.cancel()`.https://github.com/square/okhttp/issues/1592#issuecomment-143309765 (2认同)