查看原文
其他

Rxjava与Retrofit相恋,如何优雅的取消请求!

2017-02-14 Tamic 开发者技术前线

最怜天上2.14,又逢人间情人节!特殊的日子,努力工作的同时不要忘记给心爱的人礼物哦!脱单的请继续虐狗,没脱单的就继续吃狗粮吧!



前几篇主要介绍了retrofit基本使用,结合rxJava的案列,以及RxJava结合retrofit的封装,包括公用参数,局部参数请求头添加,缓存,https, 文件上下传,结果解析,异常处理等,还有一些,那么还有一个比较关键的是取消问题。

两者结合技巧可点击阅读:

垂直入口:Rxjava +Retrofit 你需要掌握的几个技巧,Retrofit缓存,统一对有无网络处理, 异常处理,返回结果问题

01

Rertofit取消请求

构建API

Call<LoginResult> call = apiService.getData("Tamic", "1234");   call.enqueue(new Callback<LoginResult>() {   @Override   public void onResponse(Call<LoginResult> call, Response<LoginResult> response) {   }   @Override   public void onFailure(Call<LoginResult> call, Throwable t) {   }   }); }

取消请求

直接用call实例进行cancel即可

call.cancel();

02

RxJava取消订阅


遇到取消取消订阅的情况可以直接:

subscription.unsubscribe();

避免重复:

if (!subscription.isUnsubscribed()) {    
   subscription.unsubscribe();
}

如果需要在非UI线程的情况,可以直接指定线程为IO线程。

observable.unsubscribeOn(Schedulers.io());

03

这RxJava+Retrofit取消请求


好了 目前很多情况是使用两者来做网络框架的,那么在两者结合情况我们是如何使用取消某个请求呢,或者避免重复请求,今天就稍微给大家介绍一下本人的处理方式

构建一个接口

主要管理rxJava的Subscription描述。这个东东可以理解为对一些事件所给的总Tag一样,你去办理身份证给的回执单一样,有了回执单你就可以追踪办理身份证的这个事情。

/** * Created by Tamic on 2017-01-16. */public interface RxActionManager<T> {void add(T tag, Subscription subscription);void remove(T tag);void cancel(T tag);void cancelAll(); }

具体impl的RxApiManager

主要处理真实的取消请求作用,维护RxJava的订阅池。

/** * Created by Tamic on 2017-01-16. */

public class RxApiManager implements RxActionManager<Object> {
 private static RxApiManager sInstance = null;
 private ArrayMap<Object, Subscription> maps;
 public static RxApiManager get() {
     if (sInstance == null) {
       synchronized (RxApiManager.class) {
          if (sInstance == null) {           sInstance = new RxApiManager();        }      }    }
   return sInstance;  }
@TargetApi(Build.VERSION_CODES.KITKAT)
private RxApiManager() {    maps = new ArrayMap<>(); }
@TargetApi(Build.VERSION_CODES.KITKAT)
@Override public void add(Object tag, Subscription subscription) {   maps.put(tag, subscription); }
@TargetApi(Build.VERSION_CODES.KITKAT)
@Override public void remove(Object tag) {
 if (!maps.isEmpty()) {   maps.remove(tag); } }
@TargetApi(Build.VERSION_CODES.KITKAT)
public void removeAll() {
 if (!maps.isEmpty()) {   maps.clear();  } }
@TargetApi(Build.VERSION_CODES.KITKAT)
@Override public void cancel(Object tag) {
   if (maps.isEmpty()) {
      return;    }
    if (maps.get(tag) == null) {
     return;     }
    if (!maps.get(tag).isUnsubscribed()) {       maps.get(tag).Unsubscribed();       maps.remove(tag); } }
@TargetApi(Build.VERSION_CODES.KITKAT)
@Override public void cancelAll() {
  if (maps.isEmpty()) {
      return;     }   Set<Object> keys = maps.keySet();
  for (Object apiKey : keys) {     cancel(apiKey);   } } }

使用姿势

具体请求的subscription

 Subscription subscription = Retrofit返回的subscription实例

加入rxApi管理池

RxApiManager.get().add("my", subscription);

取消

 RxApiManager.get().cancel("my");

一般我们在在activity的 onDestroy(), Fragment的 onDestroyView()中调用

也可以在onPause()中取消;

@Overrideprotected void onPause() {    
super.onPause();    RxApiManager.get().cancel("my"); }

 好了两句代码就能优雅的取消请求了,赶快试试吧!


04

案列下载

欢迎star

 github:

2,14情人节

Tamic社区 一个不只是干货的社区长按,识别二维码,加关注

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存