【问题标题】:Perform requests with Retrofit inside custom Runnable在自定义 Runnable 中使用 Retrofit 执行请求
【发布时间】:2014-04-24 13:05:38
【问题描述】:

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

RequestQueue.cancel(字符串标签)

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

【问题讨论】:

    标签: android threadpoolexecutor retrofit


    【解决方案1】:

    我想我找到了一个更好的解决方案:我没有阻止 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()

    【讨论】:

    • 你能多加一点代码吗?喜欢请求调用
    • @letroll 您可以正常发出请求,但不是使用new Callback,而是使用Callback cb = new Callback,这样您就有了参考,然后可以调用callbacks.add(cb)
    • 我不是专家,但我认为您在请求得到响应后返回(在您的代码中:成功)。你实际上并没有在半空中取消请求:) 但我可能错了。
    • @feresr 是的,在改造 2.0 之前,无法取消任何正在进行的请求,但这样响应将被忽略。
    • 还有@feresr,他请求得到响应后返回,但是当请求成功时他什么都不做,这意味着实际上的请求被取消了,我也认为这是最好的方法,因为无法自行取消改造请求
    【解决方案2】:

    我已经实现了一个基于 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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-25
      • 1970-01-01
      • 2015-01-28
      • 2015-09-20
      相关资源
      最近更新 更多