取消

Kalle中每一个异步请求都是可以取消的,无论在请求已经发起,还是请求已经在执行。

Canceller canceller = Kalle.get("http://www.example.com")
    .perform(UserInfo.class, new SimpleCallback<UserInfo>() {
        @Override
        public void onResponse(SimpleResponse<UserInfo> response) {
            // 请求响应了。
            UserInfo user = response.result();
        }
    });

Canceler是一个接口,内部已经实现,开发者不需要关心。

判断当前请求是否已经取消:

if(canceller.isCancelled()) {
    // 这个请求是被取消的。
}

取消请求:

canceller.cancel();

批量取消

很多时候我们不会对单个请求进行取消,而是在页面退出的时候取消这个页面发起的所有请求以释放资源。

在Kalle中,批量取消是通过Tag实现的,内部通过对比Tag的一致性进行取消操作,因此开发者必须要给Request设置Tag:

Object tag = ...;

Kalle.get("http://www.example.com")
    .tag(tag)
    .perform(new SimpleCallback<UserInfo>() {
        @Override
        public void onResponse(SimpleResponse<UserInfo> response) {
            UserInfo user = response.result();
        }
    });

当我们需要批量取消的时候:

private Object cancelTag = ...;

private void request() {
    Object tag = cancelTag;
    Kalle.get...
}

@override
public void onDestroy() {
    super.onDestroy();
    // 批量取消:
    Kalle.cancelRequest(cancelTag);
    // 或者:
    RequestManager.getInstance().cancel(cancelTag);
}

内部对比Tag一致性的的原理:

public void cancel(Object tag) {
    Object newTag = mRequest.tag();
    if (tag == newTag || (tag != null && newTag != null && tag.equals(newTag))) {
        mCanceller.cancel();
    }
}

results matching ""

    No results matching ""