이제는 onPause()
과 onResume()
사이에 도착하는 응답이 삭제된다는 점에서 @ kyle-ivey의 관심사를 해결하려고 시도했습니다. 실제 응용 프로그램에서이 기능을 경험 했으므로 이것은 중요한 문제입니다.
내 접근법은 토마스 모어 만 (Thomas Moerman)의 응답으로 구현 된 이벤트 버스 패턴을 기반으로합니다. 처음부터 예제 애플리케이션을 보완했지만 말입니다. Otto Event bus Library, Gson 및 Volley에 따라 다릅니다. 이것은 Maven tom을 사용하여 IntelliJ 13 Ultimate에서 구현되어 종속성을 해결합니다.
솔루션 : 이전 응답에 활동이 전환되는 동안 이벤트 수신의 책임을 대신하는 HTTP 응답 버퍼 역할을하는 클래스를 추가합니다. 완료되면 활동은 활동이 이벤트 버스에 연결되지 않은 상태에서 도착했을 수있는 응답을 적극적으로 폴링합니다. 여기
@Override
protected void onPause() {
super.onPause();
ServiceLocator.ResponseBuffer.startSaving(); // The buffer takes over
ServiceLocator.EventBus.unregister(this); // Unregistering with Otto
}
@Override
protected void onResume() {
ServiceLocator.EventBus.register(this); // Re-registering
ServiceLocator.ResponseBuffer.stopAndProcess(); // Process any responses buffered
}
을 the ResponseBuffer-class의 구현 : 그것은 다음과 같은 방식으로 이벤트 버스 등록에 대한 onPause
및 onResume
- 이벤트에 온/오프 후크.
주의 할 1 : 활동이 재개되지 않습니다, 그리고 둘 stopAndProcess()
도 stopAndPurge()
는 향후 활동에 호출되지 않은 경우, 버퍼 메모리 누수의 원인이 될 수 있습니다. 사용 방법을 알고 있어야합니다. 안전한 패턴은 stopAndProcess()
을 onResume()
에 넣고 모두 개의 활동으로 구성됩니다.
경고 2 : 스레드로부터 안전하지 않습니다. 저장하고있는 곳과 이벤트 버스를 등록하지 않은 곳 사이에서 컨텍스트 스위치를 이동하려면 이벤트를 두 번 또는 0 번받을 수 있습니다.
예는 UI와 지원 클래스의 형태로 몇 가지 테스트 코드를 포함하지만, 별도의 프로젝트에이 패턴을 활용하려는 경우 필요 주요 클래스는 다음과 같은 패키지에있는 것들입니다 :
- nilzor.ottovolley.core
- nilzor.ottovolley.messages
테스트를위한 UI와 완벽한 예를 들어 github에-저장소 OttoVolleyDoneRight를 참조하십시오.
"해당 요청에 대한 응답을 얻는 방법 또는 아직 보류중인 경우 어떻게 다시 연결합니까?" - 앱이 더 이상 포 그라운드에 없기 때문에 스레드가 실행되는 것을 방지하지 못합니다. 'Request'가 아직 전달되지 않았다고 생각하는 이유는 무엇입니까? 비동기 작업에는 보존 된 단편을 사용하십시오. 따라서 방향 변경에 상관없이 비동기 작업은 통신하기에 안정적인 기반을 갖습니다. – CommonsWare
몇 가지 이유로 나는 '발리'가 배경 (Robospice와 같은)으로 가면 응답을 보내지 않는다는 인상을 받았지만, 당신 말이 맞습니다. 전달을 중지하려면'requestQueue.cancel (...) '을 호출해야합니다. 나는 여전히'stop/resume' 동안 반응을 적절히 전달하는 좋은 간단한 방법을 생각하고있다. –