2014-11-04 97 views
1

最近我开始使用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(); 
+0

您的问题 – 2017-08-04 14:03:08

回答

0

你为什么不禁止如果清爽拉刷新?在收到排队地点的回复之前,不允许提出请求是否有意义?

+0

这是一个选择的任何解决方案,但我一直在寻找在应用的后端水平的修复,而不是前端级别。含义 - 我想要一个体系结构修复程序,并且不要在我认为有用的任何地方使用变通方法 – Nativ 2014-11-05 09:12:13

0

您可以通过标记来阻止执行更多请求,这是微不足道的。

有这样的一个类:请确保您输入正确。

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); 
} 
+0

只有在请求完成后才能执行回调。如果同一个请求已经存在,我不希望请求被输入到threadPoolExecuter的队列中。这里的代码是不相关的 – Nativ 2014-11-05 09:09:56

+0

只有当它完成或失败时才执行(添加到threadexecutor)。即,如果条件通过。 – 2014-11-06 03:49:32