2013-09-25 3 views
10

나는 android robospice 라이브러리가 활동주기를 관리하는 방법에 대한 기술 답변을 찾고 있습니다. 은 시작 페이지에서 :.robospice는 활동주기를 어떻게 관리합니까?

https://github.com/octo-online/robospice/wiki/Starter-Guide

"당신의 활동 (또는 다른 컨텍스트)의 내부 클래스로서, 당신의 UI를 업데이트하는 RequestlListener를 추가 메모리 누수에 대해 걱정하지 마십시오, RoboSpice는 활동의 관리 수명주기. "

제 질문은 로딩 한 후 올바른 컨텍스트로 올바른 리스너를 호출 할 수 있도록, 그리고 액티비티가 파괴되어 새로운 인스턴스로 다시 생성 된 후에도 올바른 리스너를 호출 할 수 있도록 robospice가 자동으로 요청 리스너를 업데이트하는 방법입니다.

나는 소스 코드를 리버스 엔지니어링려고 노력했지만 아직 답을 못 찾았 :

https://github.com/octo-online/robospice

답변

9

@Take Chances Make Cha. 당신이 말하는 것은 완전히 옳습니다. RS는 네트워크 요청 및 활동의 라이프 사이클 관리라는이 급히 염두에두고 설계되었습니다.

@ craigrs84. 기본적으로 RS의 경우 요청이 처리 될 때 관련 활동이 활성 상태 일 때 이라는 청취자가 호출됩니다.. 액티비티가 더 이상 작동하지 않으면 모든 리스너가 RS로부터 연결 해제되며 알림이 수신되지 않습니다.

RS의 주된 목적은 메모리 누수가 없는지 확인하는 것입니다. 죽을 때 죽을 때 쓰레기 수거 될 것입니다. RS는 쓰레기를 막을 수있는 어떤 하드 참조도 보유하지 않습니다. 수집. 이것이 바로 RoboSpice의 핵심 아이디어입니다.

보류중인 요청으로 활동의 새 인스턴스를 보충하려면 (예를 들어 요청을 실행 한 다음 해당 장치를 회전 한 다음 활동의 새 인스턴스를 가져오고 해당 새 인스턴스에서 이전 인스턴스에 의해 실행 된 요청의 결과), 이는 RS에서 가능합니다.

그런 경우에는 spiceManager.start (..)를 호출 한 직후에 spiceManager.addListenerIfPending을 사용하십시오. 이렇게하면 새 요청이 실행되지 않지만 보류중인 요청에 새 수신기가 다시 연결됩니다. 보류중인 요청이 없으면 아무것도 수행하지 않습니다.

+0

따라서 requestCacheKey를 제공하지 않고 동일한 Activity의 여러 인스턴스가 동시에 실행되는 경우 addListenerIfPending이 올바르게 작동합니까? 또는 그 경우 정보가 충분하지 않은 것입니까? 이것은 아마 드문 시나리오이지만 나는 호기심이 많다. – craigrs84

+0

@snicolas shouldStop() (또는 비 - 비동기 메서드)를 호출하지 않으면 Activity, Fragments, Services 등에 등록 된 리스너에게 라이브러리가 다시 호출되지 않는다는 것이 궁금합니다. 소스를 너무 많이 파고 들지 않고 라이브러리의 초기 사용 및 테스트를 토대로, "사망"한 객체에 대한 콜백을 받으면 예외가 발생합니다. 또한 도서관은 훌륭합니다. 좋은 일을 계속하십시오! – AllDayAmazing

+0

shouldStop을 호출하지 않으면 리스너가 트리거됩니다. 이것은 종종 청취자가 내부 클래스이고 파괴 된 활동 인스턴스에 대한 참조를 보유하기 때문에 충돌 및 메모리 누수를 일으킬 수 있으며 리스너에서 findViewById와 같은 작업을 수행하면 충돌이 발생할 수 있습니다. 나는 당신이 그것을 가지고 있다고 생각합니다. 단지 일을 분명히하고 싶었습니다. – Snicolas

2

짧은 대답, 내 경험에서, 그것은하지 않습니다.

예를 들어, SpiceManager.shouldStop()을 호출하지 않고 요청을 실행해도 RequestListener에 대한 참조는 계속 유지되며 Activity/Activity가있을 경우 참조 된 항목을 업데이트하려고하면 메모리 누수가 발생할 수 있습니다. 조각/서비스가 더 이상 존재하지 않습니다.

+0

죄송 합니다만, 아니요, 리스너와 함께 RS에 메모리 누수가 없습니다. 그들은 제거되고 shouldStop에서 바로 가비지 수집됩니다. – Snicolas

관련 문제