좋아, Google이 여기있는 사람을 대상으로합니다. 적절한 해결책 : 실제로이 기능은 이미 라이브러리에 있습니다. 보류중인 요청이 발견되었을 때 호출되는 메소드가있다. 아무 것도하지 않는다.
public interface MyPendingRequestListener<T> extends PendingRequestListener<T> {
void onRequestAggregated();
}
참고 :
이 PendingRequestListener
을 확장 자신의 인터페이스를 만들기 :
당신은 할 필요가 당신이 Robospice을 통해 요청을 할 때이 인터페이스를 구현 요청 listeneres를 사용해야합니다.
RequestListenerNotifier
을 구현하는 클래스를 만듭니다. 나는 DefaultRequestListenerNotifier
을 copy-pasting (다른 방법으로 porer 통지 구현을 포함하고 있기 때문에 메소드 post(..)
이 private이기 때문에 확장 할 수 없었다). 예 : MyRequestListenerNotifier
.
재정의 방법 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();
}
}
}
}
}
는 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);
를 사용하여 캐시. http://stackoverflow.com/a/27136012/2440169를 참조하십시오. 비슷한 문제입니다. – viduka
매우 더러운 해킹처럼 보입니다. 적절한 캐시 구현을 작성해야합니다 ... 시도해 보겠습니다. 그러나 실제로 Robospice에서 적절한 API를 찾으려고합니다. – Deinlandel
Robospice 확장 (Spring, Google HTTP 클라이언트, Retrofit)의 사전 정의 된 서비스를 사용하는 경우 캐시가 이미 구현되어 있습니다. – viduka