2015-02-04 4 views
1

RxJava를 사용하여 백그라운드 스레드에서 메소드를 실행하고 전경 스레드에서 결과를 처리하는 방법을 파악하려고합니다. 나는 해결책을 발견했지만 정신병 체크를하고 더 좋은 방법이 있는지 관찰하기를 원했는데 Observables가 유사한 일을하도록 여러 가지 다른 방법이있는 것처럼 보였기 때문입니다.RxJava Observables를 사용하여 백그라운드 스레드에서 객체를 생성하는 함수 사용

여기에 내가 가진 무엇 예상대로

Observable.defer(
     () -> Observable.just(
      // A. Should run on Scheduler.newThread 
      db.query(
       false, DATABASE_TABLE, null, 
       null, null, null, null, null, 
       null))) 
    .subscribeOn(Schedulers.newThread()) 
    .observeOn(AndroidSchedulers.mainThread()) 
    .subscribe(
     Subscribers.create(
      // B. Should run on AndroidSchedulers.mainThread 
      cursor -> adapter.swapCursor(cursor) 
     )); 

코드가 작동합니다. A는 백그라운드 스레드에서 실행되고 B는 주 스레드에서 실행됩니다.

내 질문에이 질문은 충분히 합리적인 것처럼 보이지만이를 위해보다 우아한 방법이 있습니까?

답변

1

defer이 그것을 할 수있는 충분히 괜찮은 방법이지만, 옵션 RxAsyncUtil lib 디렉토리로,이 같은 약간 더 멋진 fromFunc0, 사용할 수 있습니다 또한

Observable.fromFunc0(() -> db.query(...)) 
    .subscribeOn(... etc. 

을, 당신은 Subscribers.create을 사용할 필요가 없습니다, 구독의 주요 과부하 중 하나가 onNext에 대해 단일 작업을 수행하기 때문입니다.

그래서, 당신이 될 수 구독 :

.subscribe(cursor -> { adapter.swapCursor(cursor) }) 

(.? 100 % {} s는 java8 람다와 필요한 경우 swapCursor가 무효 인 경우 그들이하지 않을 수 있는지 ... 모두 시도를)

모두 함께

그래서 :

Observable.fromFunc0(() -> db.query(
    false, DATABASE_TABLE, null, null, null, null, null, null, null)) 
    .scheduleOn(Schedulers.newThread()) 
    .observeOn(Schedulers.mainThread()) 
    .subscribe(cursor -> { adapter.swapCursor(cursor) }) 

꽤 꽉 구현처럼 보인다. :)

+0

아주 좋은 제안, 감사합니다! – emmby

관련 문제