2014-11-04 296 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