在自定义Runnable中使用Retrofit执行请求

时间:2014-04-24 13:05:38

标签: android threadpoolexecutor retrofit

我正在使用VolleyRetrofit迁移到自定义实现,但我正在尝试向我的实现添加一些我喜欢的Volley功能,例如

RequestQueue.cancel(String tag)

如果Request具有请求的标记,则通过将booleanmCanceled设置为true来取消该标记。 run方法检查此值并返回它是否为真。 为了能够使用Retrofit重现这一点,我应该可以使用我的自定义类来实现Runnable而不是默认类,我有mTagmCanceled字段。 此外,Volley还能够在活动Thread内设置此类标记并立即停止它们。我已经实现的cancelAll方法只是将队列排入另一个队列,但无法访问活动线程。 是否可以使用RetrofitThreadPoolExecutor获得相同的结果?

2 个答案:

答案 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);