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

любое решение для вашей проблемы –

ответ

0

Почему бы не запретить тянуть, чтобы обновить, если его освежающий? Разве не было бы смысла не разрешать запрос, пока вы не получите ответ вместо очереди?

+0

Это вариант, но я искал исправление уровня серверной части приложения, а не интерфейсный уровень. Значение - я хочу исправление архитектуры и не иметь обходной путь везде, где я нахожу его полезным. – Nativ

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

+0

Вы выполняете (добавляете в threadexecutor) его только в том случае, если он завершился или завершился с ошибкой. I.Е если условие прошло. –

Смежные вопросы