2012-11-07 8 views
7

어제 Square에서 OTTO를 사용하기 시작 했으므로 지금까지는 좋은 출발을 보았습니다.다른 활동의 OTTO 및 단편

Otto는 FragmentActivity에서 이미 호스팅 된 Fragment를 가지고 있고 FragmentActivity가 호스팅하는 Fragment간에 의사 소통을해야 할 때 멋지게 사용할 수 있습니다.

이미 호스팅되면 #onResume() 메도는 호출되는과 조각은 Eventbus에 자신을 등록 할 수 있습니다

:

@Override 
public void onResume() 
{ 
    super.onResume(); 
    BusProvider.getInstance().register(this); 
} 

내 문제 :

추가에 포함 된 조각 Eventbus를 통해 이벤트를 수신해야하는 활동은 다음과 같습니다.

public AnotherFragmentHostedInSomeActivity extends Fragment 
{ 
     ..... 

    @Subscribe 
    public void onSomethingHappend(final Event event) 
    { 

      final SomeObject deliveredObject = event.getSomeObject(); 

public class SomeFragmentSendingDataToAnotherFragment extends Fragment 
{ 
      ... 
    private void sendData() 
    { 
      final Intent intent = new Intent(applicationContext, SomeActivity.class); 
      applicationContext.startActivity(intent);         
      BusProvider.getInstance().post(new Event(someObject)); 

이미 볼 수 있듯이,이 코드는 사기입니다 : 당신이 에게이이 코드와 같은 조각을 호스팅하는 다른 활동을 호출 할 때 여전히 복잡하고 있습니다. 활동을 시작한 다음 라이프 사이클 때문에 해당 활동이 수행하지 않는 부분으로 데이터를 보냅니다. 그래서 활동이 생성되고 Fragements도 생성됩니다. onResume Methode가 호출되면서 Fragement가 @Subscribe를 사용하여 자신을 등록 할 수 있습니다. 그러나이 모든 것은 이후에 이 발생하고 이벤트는 이미 EventBus를 통해 게시됩니다. 그래서 Interrest의 단편은 결코 EventBus에 의해 호출되지 않습니다.

누구나 현명한 방법으로이 작업을 수행 할 수 있습니다.

몇 가지 추가 정보가 있습니다. 어제 나는 OTTO와 함께 멋진 플레이 어라운드를 경험했습니다. 필자의 경우, APP가 태블릿이 아닌 스마트 폰에서 실행될 때 필자의 경우 다른 활동으로 데이터를 보내야 할 때만 문제가 발생합니다. Intent와 Parcelable을 통해 모든 데이터를 보내기 전에. Otto는 Parcleable Objects를 작성할 필요성을 줄이므로이 방법을 사용하고 싶습니다.

답해 주셔서 감사합니다.

답변

16

두 번째 활동이 시작될 때까지 원래 활동이 사라졌습니다. 다른 사람들이 지적했듯이, Activity에서 Activity로 데이터를 전달하려면 Intents를 사용하는 것이 가장 좋은 방법 일 것입니다.

이벤트 버스가 실제로 필요한 경우, 첫 번째 활동이 사라진 후에도 살아남은 개체가 필요합니다. Android에서는 Dagger 나 Guice를 사용하는 경우 @Singleton이라는 애플리케이션 컨텍스트에 연결되어 있습니다.

이 싱글 톤은 Otto의 @Produce 주석을 사용하는 곳입니다. 두 번째 Activity가 버스에 가입하면 @Produce 메서드에서 모든 데이터를받습니다.

+0

Eric을 지워 줘서 고맙습니다. 나는 버스가 할 수있는 것의 differnt 인상을 가지고 있었다. 라이프 사이클은 단순히 게임을 플레이하지 않습니다. 따라서 이벤트를 시작하기 위해 내 조각이 태블릿 또는 전화 '모드'인지 확인해야합니다. – Kitesurfer

0

@Produce 주석을 사용해 보았습니까? 두 번째 활동의 Fragment가 버스에 등록되면 오른쪽 @Produce 메서드가있는 @Subscribe 메서드가 실행됩니다.

+0

나는 이것을 시도했다. DeadObject 가입자를 추가하여 전달되지 않은 모든 객체를 가져 왔습니다. 나는 아직도 그 전화가 걸리는 것을 본다. 나는 OTTO 코드를 진실히 파헤 쳤다. 나를 위해 문제는 Activity가 OTTO에 비동기로 올라가는 것처럼 보입니다. 어떤 시점에서 onResume이 호출되지만, 그 시나리오에서 늦게까지 진행됩니다. 나는이 일을 내가 생각하기에 OTTO에 대한 전화를 연기해야한다. 그것은 dodgy aswel이다. \t \t IntentTool.showForecastActivity (getSherlockActivity(). getApplicationContext()); \t \t BusProvider.getInstance(). post (새 이벤트 (객체)); – Kitesurfer

+0

나에게 이벤트 버스를 잘못 사용하고있는 것 같습니다. 활동이 시작될 때 이벤트를 게시해야하는 경우 의도를 통해 데이터를 전달하십시오. – SeanPONeil

+0

글쎄, 나는 전에 이것을했다. 일을 간단하게하고 싶다면 가능한 한 버스를 사용하고 싶습니다. 다른 방법으로는 들어오는 데이터를 처리하는 두 가지 방법이 있습니다. – Kitesurfer

1

Otake github issue에 게시 된 Jake Wharton의 답변을 확인할 수 있습니다. @Producer를 사용할 수 있습니다.

HTTP 요청을 만들고 어딘가에 캐시 된 응답 (예 : 직원 목록)을 유지할 때. 대부분의 사람들은 요청을 시작하고 일부 콜백에 대한 응답이있을 때 자신의 활동을 직접 행동하게합니다. onPause 이후와 onResume 전에 콜백이 발생하면 문제가 발생합니다. 대신에 HTTP 호출이 버스에서 반환 될 때 이벤트를 게시하여 모든 수신 대기자가 수신하고 캐시로 보낼 수도 있습니다. 그런 다음 새 구독자가 응답에 관심이있는 경우 HTTP 호출 결과를 생성하기 위해 캐시와 대화하는 제작자를 가질 수 있습니다. 이렇게하면 활동을 일시 중지하고 등록을 취소하고 통화가 반환 될 때 재개 (및 재 등록)하면 생산자가 호출되고 활동이 통보됩니다.