2013-06-05 12 views
21

나는 Volley 프레임 워크를 좋아하지만, 여전히 그것에 대해 약간의 의구심이 있습니다.Android Volley + Loader 패턴?

예를 들어 Volley와 Loader 패턴은 어떻게 다릅니 까? 요청이 비동기 방식으로 처리되므로 배경에서 호출하는 것은별로 의미가 없습니다. 반면에 Loader 패턴을 무시하면로드를 취소하고 필요한 리소스를 다시로드하므로 다소 낭비입니다.

Volley 프레임 워크는 Android의 로더와 어떻게 작동합니까? 나는 소스에서 본 및

답변

4

AFAIK는 귀하의 요청에 대한 응답은 서버가 적절한 캐싱 headers (의 ETag)를 전송 경우, 캐시 될 것이고, 두 번째는 당신이하기 위해, GET 요청을 시도합니다 동일한 URL을 사용하는 경우 Network을 다시 호출하는 대신 cache에서 응답을 받게됩니다 (기본값 : Volleykey으로 URL으로 요청을 캐시합니다). RequestQueueRequests 추가

그것은 배경 Thread에서 호출 할 말이없는 한, MainThread에서 수행해야합니다.

+0

나는 사용자가 로딩하는 동안 장치를 회전하는 상황에 대해 생각했다. Volley 프레임 워크의 일반적인 동작은 방향 변경이 완료되면 요청을 취소하고 다시 시작하는 것입니다. 로더 패턴을 사용하면 방향 변경에서로드 상태를 보호 할 수 있습니다. – husrevo

+0

예. 당신이 올바른지.보류중인 요청에 "다시 연결"하거나 "계속 실행"하고 오리엔테이션 변경/활동 중지 - 이력서에 대한 응답을 얻을 수있는 직접적인 의미는 없습니다. –

+1

푸시 알림이 표시되기 전에 푸시 알림에 대한 추가 정보를로드하는 것과 같은 상황에서는 백그라운드 스레드에서이 이벤트를 호출하는 것이 좋습니다. 그러나 일반적인 목적을 위해 주 스레드에서 호출하는 것이 좋습니다. – Gabriel

1

RequestFuture 클래스를 통해 Volley와 동기식 요청을하는 것이 가능합니다. 나는 이것을 개인적으로 들여다 보지 않았지만 로더와 함께 두 세계의 장점을 누릴 수있는 것처럼 보입니다 (로더의 로딩 안정성과 함께 Volley 's Cache).

+0

이렇게하면 '로더'는 중간 결과와 최종 결과를 모두 반환 할 수 없습니다. 'RequestFuture'는 첫 번째로받은 결과 만 반환합니다 (캐시를 사용하는 경우 중간입니다). 최종 결과는 캐시를 업데이트하고 UI로 전파 할 수 없습니다. –

+0

좋은 지적입니다. 이 시점에서 나는 로더를 전혀 사용하지 않는 것이 좋습니다. 오버 헤드가 너무 많아서 Retrofit 또는 Volley와 같은 외부 라이브러리에서 고유 한 솔루션을 만드는 것이 좋습니다. – Gabriel

+0

동기식 요청이 필요 없습니다. 'Loader '을 확장하면 어쨌든 백그라운드 스레드에서 작업해야합니다. – Pijusn

12

로더는 발리 요청을 포함하여 거의 모든 것을 캡슐화 할 수 있습니다. 로더가 이미 배경 작업을 처리하고 Volley와 같은 기본 스레드에서 다시 호출하는 프레임 워크를 캡슐화 할 때 로더 구현은 AsyncTaskLoader에서 상속하지 말고 간단히 Loader 기본 클래스에서 상속합니다. 그런 다음 onForceLoad() 메소드에서 발리 요청을 시작합니다.

로더가 콜백을 통해 메인 스레드에서 결과를 얻으면 deliverResult()을 호출하여 Activity/Fragment로 푸시해야합니다.

로더는 진행중인 발리 요청에 대한 참조를 유지해야 onStopLoading()에서 취소 할 수 있습니다. onStopLoading()은 화면 회전과 같은 구성 변경이있을 때만 호출되며 Activity를 벗어날 때만 호출됩니다.

유일한 단점은 로더에는 오류를 전파하는 기본 제공 메커니즘이 없으며 발리는 그렇지 않습니다. 따라서 로더 내부의 Volley 오류 콜백에서 null 결과를 제공하거나 로컬 브로드 캐스트를 보내어 Activity/Fragment에 오류를 알릴 필요가 있습니다.

관련 문제