改造:如何解决请求重复

时间:2014-11-04 16:39:16

标签: android android-networking

最近我开始使用Retrofit进行开发,并且可以立即注意到它没有提供一些重要的功能,例如 - 重试,认证处理,优先级等等。

我设法实现优先级并自行重试,但遇到难以解决的问题。

我想设法在他们到达执行者队列之前“捕获”网络请求,以便一遍又一遍地避免相同的请求。

对于前。用户有时可以一个接一个地拉5次刷新,我不想调用5个相同的请求。检查相同请求很容易 - 具有相同参数的相同域。

这是我的实施:

// the thread factory of the thread pool, we using it to indicate the threads' priority
    ThreadFactory threadFactory = new ThreadFactory() {
        @Override
        public Thread newThread(Runnable r) {
            Thread t = new Thread(r);
            t.setPriority(threadPriority);
            return t;
        }
    };

    mQueue = new LinkedBlockingQueue<Runnable>();
    mExecuter = new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE_TIME, KEEP_ALIVE_TIME_UNIT, mQueue);

    mExecuter.setThreadFactory(threadFactory);

    mRestAdapter = new RestAdapter.Builder().setClient(new AndroidApacheClient()).setExecutors(mExecuter, mExecuter)
            .setEndpoint(NetworkContants.DOMAIN).setRequestInterceptor(mRequestInterceptor).setConverter(new GsonConverter(new Gson()))
            .build();

2 个答案:

答案 0 :(得分:1)

您可以阻止使用标记执行更多请求,这很简单。

有一个这样的课程:确保你输入正确的。

public class CheckableCallback<T> implements Callback<T> {

    private boolean isRunning;

    public boolean isRunning() {
        return isRunning;
    }

    public void setRunning(boolean isRunning) {
        this.isRunning = isRunning;
    }


    @Override
    public void success(T t, Response response) {
        setRunning(false);
    }

    @Override
    public void failure(RetrofitError error) {
        setRunning(false);

    }
}

在执行之前,请检查回调是否正在运行:

if(!mRefreshingCallback.isRunning()){
  //execute 
  mRefreshingCallback.setRunning(true);
}

答案 1 :(得分:0)

如果令人耳目一新,你为什么不禁止拉动?在收到代替排队的响应之前,不允许请求是否有意义?