2013-06-20 13 views
17

Volley을 사용하여 방향 변경, Activities/Fragments 중단/재개 방법은 어떻게 처리 할 수 ​​있습니까?Android Volley - 오리엔테이션 변경

내가 GET 요청에 대한 응답은 캐시 할 것을 알고 두 번째는 우리가 그 요청을 시도, 우리는 (서버가 적절한 HTTP 헤더를 보내는 경우). 캐시 된 응답을

그러나 무슨 약 POST? POST 개의 요청 (예 : 한 번만 실행하고 싶은 등록)을하고 내 앱이 배경으로 이동하고 앱이 백그라운드에서 진행되는 동안 요청이 완료되면 앱으로 돌아 간다고 가정 해 보겠습니다. 해당 Request에 대해 Response을 얻는 방법, 또는 아직 보류중인 경우 어떻게 다시 연결합니까?

AFAIK Volley에는 AFAIK가 거의 지원되지 않습니다. 내가 맞습니까? 위에서 언급 한 시나리오를 쉽게 해결할 수있는 방법이 있습니까? Volley?

+5

"해당 요청에 대한 응답을 얻는 방법 또는 아직 보류중인 경우 어떻게 다시 연결합니까?" - 앱이 더 이상 포 그라운드에 없기 때문에 스레드가 실행되는 것을 방지하지 못합니다. 'Request'가 아직 전달되지 않았다고 생각하는 이유는 무엇입니까? 비동기 작업에는 보존 된 단편을 사용하십시오. 따라서 방향 변경에 상관없이 비동기 작업은 통신하기에 안정적인 기반을 갖습니다. – CommonsWare

+0

몇 가지 이유로 나는 '발리'가 배경 (Robospice와 같은)으로 가면 응답을 보내지 않는다는 인상을 받았지만, 당신 말이 맞습니다. 전달을 중지하려면'requestQueue.cancel (...) '을 호출해야합니다. 나는 여전히'stop/resume' 동안 반응을 적절히 전달하는 좋은 간단한 방법을 생각하고있다. –

답변

8

발리 (Volley)는이 상자에 대한 메커니즘을 제공하지 않지만 Android 용 Square 라이브러리 인 Otto 라이브러리를 살펴볼 수 있습니다. 사용자의 상황을 우아하게 처리하도록 만들어졌습니다.

Volley 요청에 대한 수신기를 구현하여 Bus에 성공적인 응답을 게시하고 "RegisterEventSuccess"와 같은 이벤트 객체로 래핑합니다 (직접 정의). Otto 's @Subscribe 메커니즘을 사용하여 활동 또는 단편에이 이벤트 유형을 등록하십시오. 예를 들어, 하나의 Activity가 Volley 요청을 시작하고 화면 방향 변경으로 인해 죽으면 다른 Activity 인스턴스 (또한 Otto 버스에 등록 됨)가 Volley 요청의 응답을 포함하는 이벤트를 수신 할 수 있습니다.

희망이 유용했습니다.

+0

이 솔루션은 확실히 재미있을 것 같습니다. 당신이 이것을 구현 한 곳이 있습니까? 문제가 발생 했습니까? – Rasmus

+1

죽은 질문을 재개하지 말고 요청/응답 관리를 위해 Volley + Otto의 몇 가지 예를 찾고 있었는데이 사람은이 두 가지를 융합시킨 아주 깨끗한 예를 함께 작성했습니다 https://github.com/tslamic/AndroidExamples/tree/master/HttpBinVolley – Selecsosi

+5

이 솔루션을 사용하면 활동이 전환되는 순간 (첫 번째 활동의 onDestroy와 새로 지향 된 onCreate 사이)에 네트워크 응답이 반환 될 가능성을 어떻게 처리 할 수 ​​있습니까? 여기서 어떤 활동도 버스에 등록되지 않고 이벤트를 기다리고 있습니다. @Producer 메서드는이 문제를 해결할 수 있지만 일반적으로 일반 네트워크 캐시로 작동하는 데 적합하지 않으며 원래 패턴과 실제로 정렬되지 않습니다. –

4

이제는 onPause()onResume() 사이에 도착하는 응답이 삭제된다는 점에서 @ kyle-ivey의 관심사를 해결하려고 시도했습니다. 실제 응용 프로그램에서이 기능을 경험 했으므로 이것은 중요한 문제입니다.

내 접근법은 토마스 모어 만 (Thomas Moerman)의 응답으로 구현 된 이벤트 버스 패턴을 기반으로합니다. 처음부터 예제 애플리케이션을 보완했지만 말입니다. Otto Event bus Library, GsonVolley에 따라 다릅니다. 이것은 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의 구현 : 그것은 다음과 같은 방식으로 이벤트 버스 등록에 대한 onPauseonResume - 이벤트에 온/오프 후크.

주의 할 1 : 활동이 재개되지 않습니다, 그리고 둘 stopAndProcess()stopAndPurge()는 향후 활동에 호출되지 않은 경우, 버퍼 메모리 누수의 원인이 될 수 있습니다. 사용 방법을 알고 있어야합니다. 안전한 패턴은 stopAndProcess()onResume()에 넣고 모두 개의 활동으로 구성됩니다.

경고 2 : 스레드로부터 안전하지 않습니다. 저장하고있는 곳과 이벤트 버스를 등록하지 않은 곳 사이에서 컨텍스트 스위치를 이동하려면 이벤트를 두 번 또는 0 번받을 수 있습니다.

예는 UI와 지원 클래스의 형태로 몇 가지 테스트 코드를 포함하지만, 별도의 프로젝트에이 패턴을 활용하려는 경우 필요 주요 클래스는 다음과 같은 패키지에있는 것들입니다 :

  • nilzor.ottovolley.core
  • nilzor.ottovolley.messages

테스트를위한 UI와 완벽한 예를 들어 github에-저장소 OttoVolleyDoneRight를 참조하십시오.

+0

나는이 전략을 정말 좋아합니다. 공유해 주셔서 감사합니다! –

0

Volley 라이브러리를 사용하여 네트워크에서 데이터를 다운로드 할 때 발생하는 문제를 해결 한 간단한 해결책이 있습니다. 앱에서 Google 권장 정보로 인해 조각을 사용하는 경우 데이터를로드하는 동안 사용자가 화면을 회전하면 충돌을 방지하기 위해 수행해야하는 모든 작업보다 조각 (-s)의 onCreateView 메서드에 setRetainInstance(true);이 삽입됩니다.

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View theView = inflater.inflate(R.layout.fragment_studios, container, false); 
    setRetainInstance(true); 
    lvStudios = (ListView) theView.findViewById(R.id.lvStudios); 
    return theView; 
}