2014-09-05 3 views
1

나는 robospice를 사용하여 매우 간단한 경우, 즉 로그인 화면을 구현하려고합니다. 로그인 버튼을 클릭하면 로딩 애니메이션이 표시되고 SpiceManager.execute(..)을 사용하여 요청합니다 (캐싱없이, 물론 로그인 요청이므로 매번 서버에 실제로 전화해야합니다).Robospice - addListenerIfPending - 요청이 발견 된 경우 어떻게 알 수 있습니까?

Activity.onStart()에서 화면 회전 등을 처리하려면 요청이 실제로 보류중인 경우 실제 요청을하지 않고 애니메이션을로드하도록 표시해야합니다.

문제 : PendingRequestListener에는 onRequestExists() 방법이 없습니다. onRequestNotFound() 만 있습니다.

하나의 가능한 솔루션 (항상 만족스럽지 않음)은 항상 로딩 화면을 그 다음 addListenerIfPending(..)을 호출 한 다음 onRequestNotFound()에서 로딩 애니메이션을 제거하십시오. 실제로 요청이 없으면 "깜박 거리는"로딩 화면이 생겨서 정말 안좋은 모양입니다. 원하는 행동을 구현하는 적절한 방법은 무엇입니까?

+1

를 사용하여 캐시. http://stackoverflow.com/a/27136012/2440169를 참조하십시오. 비슷한 문제입니다. – viduka

+0

매우 더러운 해킹처럼 보입니다. 적절한 캐시 구현을 작성해야합니다 ... 시도해 보겠습니다. 그러나 실제로 Robospice에서 적절한 API를 찾으려고합니다. – Deinlandel

+0

Robospice 확장 (Spring, Google HTTP 클라이언트, Retrofit)의 사전 정의 된 서비스를 사용하는 경우 캐시가 이미 구현되어 있습니다. – viduka

답변

0

좋아, Google이 여기있는 사람을 대상으로합니다. 적절한 해결책 : 실제로이 기능은 이미 라이브러리에 있습니다. 보류중인 요청이 발견되었을 때 호출되는 메소드가있다. 아무 것도하지 않는다.

public interface MyPendingRequestListener<T> extends PendingRequestListener<T> { 
    void onRequestAggregated(); 
} 

참고 :

  1. PendingRequestListener을 확장 자신의 인터페이스를 만들기 :

    당신은 할 필요가 당신이 Robospice을 통해 요청을 할 때이 인터페이스를 구현 요청 listeneres를 사용해야합니다.

  2. RequestListenerNotifier을 구현하는 클래스를 만듭니다. 나는 DefaultRequestListenerNotifier을 copy-pasting (다른 방법으로 porer 통지 구현을 포함하고 있기 때문에 메소드 post(..)이 private이기 때문에 확장 할 수 없었다). 예 : MyRequestListenerNotifier.

  3. 재정의 방법 notifyListenersOfRequestAggregated :

    @Override 
    public <T> void notifyListenersOfRequestAggregated(final CachedSpiceRequest<T> request, Set<RequestListener<?>> listeners) { 
        post(new AggregatedRunnable(listeners), request.getRequestCacheKey()); 
    } 
    
    private static class AggregatedRunnable implements Runnable { 
        private final Set<RequestListener<?>> listeners; 
    
        public AggregatedRunnable(final Set<RequestListener<?>> listeners) { 
         this.listeners = listeners; 
        } 
    
        @Override 
        public void run() { 
    
         if (listeners == null) { 
          return; 
         } 
    
         Ln.v("Notifying " + listeners.size() + " listeners of request aggregated"); 
         synchronized (listeners) { 
          for (final RequestListener<?> listener : listeners) { 
           if (listener != null && listener instanceof MyPendingRequestListener) { 
            Ln.v("Notifying %s", listener.getClass().getSimpleName()); 
            ((MyPendingRequestListener<?>) listener).onRequestAggregated(); 
           } 
          } 
         } 
        } 
    } 
    
  4. 는 SpiceService을 확장하고 (대신 표준 robospice 서비스의 사용자 정의 서비스를 이용해야합니다) 다음과 같은 메소드를 오버라이드 (override) :

    protected RequestListenerNotifier createRequestRequestListenerNotifier() { 
        return new MyRequestListenerNotifier(); 
    } 
    

그게 전부 야. 이제 addListenerIfPending을 사용하면 보류중인 요청이 발견되면 onRequestAggregated()이 호출됩니다.

중요 정보 : 요청시 캐시 키를 사용할 때만 작동합니다. 예를 들어 빈 문자열 (NOT null)을 캐시 키로 사용할 수 있습니다.

예 :

//doing request for the first time 
spiceManager.execute(request, "", DurationInMillis.ALWAYS_EXPIRED, requestListener); 
//...  
//checking if request is pending e.g. when activity is restarted 
spiceManager.addListenerIfPending(responseClass, "", requestListener);