2014-09-10 123 views
2

我需要实现非常流行的应用行为模板 - 为用户提供尝试重试失败请求的机会。现在我用SpiceServiceListener捕获失败的请求,并显示用户可以按“重试”按钮的对话框。不幸的是,使用与SpiceManager.execute()相同的CachedSpiceRequest对象不会给出所需的行为,因为如果请求不成功,RS会从mapRequestToLaunchToRequestListener中删除所有请求侦听器。所以请求可以正常工作,但不会将任何信息返回给我的活动。Robospice。按需重试失败请求

有没有简单的方法(没有修改库的代码)来实现这个?

+0

看起来像删除听众不是唯一的问题。 'SpiceRequest'有许多“状态变量”('isCanceled','future','progress'),所以如果重新使用它而没有对这些变量进行适当的重新初始化可能会导致意想不到的结果。 – Deinlandel 2014-09-11 11:59:50

+0

如果您找到解决方案,请分享,如果OAuth令牌过期,我需要重试。 – BornToCode 2014-10-02 06:17:29

+0

@BornToCode请检查我的答案 – Divers 2014-10-03 07:50:57

回答

0

不幸的是,看起来像这样的情况没有抽象的解决方案,所以我必须在每个请求中添加这样的代码。

getSpiceManager().execute(r, new RequestListener<CountProfiles>() { 
     @Override 
     public void onRequestFailure(SpiceException spiceException) { 
      if (act.getSupportFragmentManager().findFragmentByTag("network_problem") == null) { 
       NetworkProblemDialogFragm.newInstance(r, this).show(act.getSupportFragmentManager(), "network_problem"); 
      } else { 
       ((NetworkProblemDialogFragm) act.getSupportFragmentManager().findFragmentByTag("network_problem")).setSpiceRequest(r); 
       ((NetworkProblemDialogFragm) act.getSupportFragmentManager().findFragmentByTag("network_problem")).setRequestListener(this); 
      } 
     } 

     @Override 
     public void onRequestSuccess(CountProfiles countProfiles) { 
     } 
    }); 

NetworkProblemDialogFragm是重试按钮DialogFragment,在点击这个按钮,我重新执行失败的请求,利用给定的RequestListener。

不是很漂亮的解决方案,但看起来像没有更好的解决方案。