2014-05-17 6 views
0

사용자 지정 응용 프로그램 하위 클래스에서 Rx Observables를 만드는 것이 허용됩니까? 그 이유는 응용 프로그램 내부에서 BehaviorSubject를 만들 수 있고 서버에서 10 분마다 변경 사항을 요구할 것이므로이 Observable에 가입 ​​한 모든 활동 또는 단편은 마지막 변경 상태 만 얻습니다.사용자 지정 응용 프로그램 하위 클래스에서 관찰 가능 사용

질문이 아키텍처가 응용 프로그램 수명주기 측면에서 안전하고 사용하기 쉬운 것으로 간주 될 수 있는지 여부는 질문입니까?

class CustomApplication extends Application { 
    ... 

    BehaviorSubject<Friends> mFriends = new BehaviorSubject<Friends>; 
    public void createObservables() { 
     Observable.create(new Observable.OnSubscribe<Friends>() { 
     public void call(Subscriber<?> s) { 
      while(true) { 
       mFriends.onNext("randomFriendN"); 
       sleep(10sec); 
      } 
     } 
     }) 
     .subscribeOn(Schedulers.newThread()) 
     .subscribe(new Observer<List<NewsCategory>>() { 
     public void onNext(Friends f) { //empty } 
     }); 
    } 
    public BehaviorSubject<Friends> getFriends() { 
     return mFriends; 
    } 
} 

은 UPDATE : 매번 새로운 활동이 만들어지고 그것이 그것의 ApplicationContext의 BehaviorSubject이 다음에 가입 얻을 수있는 데이터를 얻을 수 원하고, 주제 지난 방출 값을 방출 할 때 왜 내가 이렇게하고 싶습니까? 예 : 뉴스 항목을 가져 왔고 뉴스 피드를 가져 왔으며 뉴스 항목의 전체 내용을 가져 오는 백그라운드 작업을 시작하려는 경우 뉴스 목록을 스크롤하는 동안 데이터 가져 오기를 시작할 수 있으며 자세한 활동을 클릭하면 이미 가져온 것에서 다운로드하거나 그냥 다운로드하십시오.

+1

모호성을 해결하기 위해 의사 코드를 제공 할 수 있습니까? – nhaarman

+0

의사 코드 종류와 함께 제공, 조언을 주셔서 감사합니다 – user1831986

+0

그냥 개선 팁 : BehaviorSubject 또한 옵저버입니다. 당신은 (BehaviorSubject)를 직접 구독 할 수 있습니다. – zsxwing

답변

2

나는 응용 프로그램을 초기화하는 동안 createObservables()가 한 번만 호출되는 한 완벽하게 안전하다고 생각합니다. 몇 가지 제안 된 변경 사항 ...

getFriends()의 반환 값에 mFriends의 BehaviorSubject 부분을 노출하지 않을 것입니다. 그런 식으로 getFriends() 호출자는 onNext() 호출을 시도하지 않습니다. 당신이 최고 안전한 사용 .asObservable로()와 발신자도 BehaviorSubject로 다시 반환 값을 캐스팅 할 수 없습니다 원하는 경우

public Observable<Friends> getFriends() { 
    return mFriends; 
} 

:로 변경합니다.

public Observable<Friends> getFriends() { 
    return mFriends.asObservable(); 
} 

나는 또한 가입 콜백에서()를 BehaviorSubject onNext를 호출하여 createObservable() 메소드를 업데이트 할 것입니다. 다음은 NewsItem을 사용하도록 약간 수정 한 코드입니다.

BehaviorSubject<List<NewsItem>> mNewsItemSubject = BehaviorSubject.create(); 

void createObservables() { 
    Observable 
      .timer(10, 10, TimeUnit.SECONDS, Schedulers.newThread()) 
      .flatMap(new Func1<Long, Observable<List<NewsItem>>>() { 
       @Override 
       public Observable<List<NewsItem>> call(Long aLong) { 
        // Normally you would create a network API that returns Observable<NewsItem>. 
        // For now just pretend this returned Observable makes an Observable 
        // network request. 
        return Observable.just(
          Arrays.asList(
            new NewsItem("fakeNewsItem"), 
            new NewsItem("fakeNewsItem1") 
          ) 
        ); 
       } 
      }) 
      .subscribe(new Action1<List<NewsItem>>() { 
       @Override 
       public void call(List<NewsItem> newsItems) { 
        mNewsItemSubject.onNext(newsItems); 
       } 
      }); 
} 

public Observable<List<NewsItem>> observeNewsItems() { 
    return mNewsItemSubject; 
} 

귀하의 안드로이드 활동은 호출 할 수 있습니다 ((CustomApplication) getApplication()). observeNewsItems() 활동이 표시되는 동안 최신 뉴스 항목과 업데이트를 얻을 수 있습니다.

final Observable<List<NewsItem>> newsItemsObservable = 
    ((CustomApplication) getApplication()).observeNewsItems(); 

newsItemsObservable 
     .observeOn(AndroidSchedulers.mainThread()) 
     .subscribe(new Observer<List<NewsItem>>() { 
      @Override 
      public void onCompleted() { 
       // All done. 
      } 

      @Override 
      public void onError(Throwable e) { 
       // Notify user of error (maybe) 
      } 

      @Override 
      public void onNext(List<NewsItem> newsItems) { 
       // Update the UI with newsItems. 
      } 
     }); 
관련 문제