我正在使用Volley
从Retrofit
迁移到自定义实现,但我正在尝试向我的实现添加一些我喜欢的Volley
功能,例如
RequestQueue.cancel(String tag)
如果Request
具有请求的标记,则通过将boolean
值mCanceled
设置为true来取消该标记。 run
方法检查此值并返回它是否为真。
为了能够使用Retrofit
重现这一点,我应该可以使用我的自定义类来实现Runnable
而不是默认类,我有mTag
和mCanceled
字段。
此外,Volley
还能够在活动Thread
内设置此类标记并立即停止它们。我已经实现的cancelAll
方法只是将队列排入另一个队列,但无法访问活动线程。
是否可以使用Retrofit
和ThreadPoolExecutor
获得相同的结果?
答案 0 :(得分:26)
我认为我找到了一个更好的解决方案:我阻止了Runnable
执行,而不是阻止请求的Callback
。
我扩展了Callback
界面:
public interface CustomCallbackInterface<T> extends Callback<T> {
public String getTag();
public String setTag(String tag);
public void cancel();
public boolean isCanceled();
}
以便每个Callback
都有一个标记和一个取消标记。然后success
方法以:
public class CustomCallback<ConvertedData> implements CustomCallbackInterface<ConvertedData>{
//failure...
@Override
public void success(ConvertedData cd, Response response) {
if(isCanceled()) return;
// ....
}
}
每次发出新请求时,我都会将创建的CustomCallback
存储在List
取消中,只需迭代列表并在具有相同标记的项目上调用cancel()
。
答案 1 :(得分:11)
我已经实现了一个基于Vektor88答案的易用类
public abstract class CancelableCallback<T> implements Callback<T> {
private static List<CancelableCallback> mList = new ArrayList<>();
private boolean isCanceled = false;
private Object mTag = null;
public static void cancelAll() {
Iterator<CancelableCallback> iterator = mList.iterator();
while (iterator.hasNext()){
iterator.next().isCanceled = true;
iterator.remove();
}
}
public static void cancel(Object tag) {
if (tag != null) {
Iterator<CancelableCallback> iterator = mList.iterator();
CancelableCallback item;
while (iterator.hasNext()) {
item = iterator.next();
if (tag.equals(item.mTag)) {
item.isCanceled = true;
iterator.remove();
}
}
}
}
public CancelableCallback() {
mList.add(this);
}
public CancelableCallback(Object tag) {
mTag = tag;
mList.add(this);
}
public void cancel() {
isCanceled = true;
mList.remove(this);
}
@Override
public final void success(T t, Response response) {
if (!isCanceled)
onSuccess(t, response);
mList.remove(this);
}
@Override
public final void failure(RetrofitError error) {
if (!isCanceled)
onFailure(error);
mList.remove(this);
}
public abstract void onSuccess(T t, Response response);
public abstract void onFailure(RetrofitError error);
}
用法示例
rest.request(..., new CancelableCallback<MyResponse>(TAG) {
@Override
public void onSuccess(MyResponse myResponse, Response response) {
...
}
@Override
public void onFailure(RetrofitError error) {
...
}
});
// if u need to cancel all
CancelableCallback.cancelAll();
// or cancel by tag
CancelableCallback.cancel(TAG);