2016-05-14 88 views
0

我正在使用RxAndroid在後臺做一些東西。這是我的代碼:RxAndroid和多線程

Observable<MyClass[]> observable = Observable.create(new Observable.OnSubscribe<MyClass[]>() { 

     @Override 
     public void call(Subscriber<? super MyClass[]> subscriber) { 
       System.out.println(Looper.myLooper() + " - " + Looper.getMainLooper()); 
       try { 
        MyObject myObject = ... 
        //do the background work 
        subscriber.onNext(myObject); 
        subscriber.onCompleted(); 
       } catch (Exception e) { 
        subscriber.onError(e); 
        e.printStackTrace(); 
       } 
      } 
     }); 

     observable.subscribeOn(Schedulers.newThread()) 
        .observeOn(AndroidSchedulers.mainThread()) 
        .subscribe(new Action1<MyClass[]>() { 
         @Override 
         public void call(MyClass[] myObjects) { 
          //do work on the ui Thread 
         } 
        } 
     ); 

這是我第一次使用RxAndroid/RxJava/Looper.myLooper()/Looper.getMainLooper()

從什麼,我說,Looper.myLooper()爲您提供了線程的名稱標識當前的代碼運行並Looper.getMainLooper()給你的ID的主線程。當我運行應用程序時,在SysOut中,它會爲它們打印出相同的ID。

我做錯了什麼或者我誤解了2 Looper功能?

回答

2

建議您不要使用Observable.create,除非您真的知道您在使用Observable做什麼。有很多東西可能會導致錯誤。

原因裏面你製作的是這裏的主線程上運行的代碼是可觀察到的正在創建時,當你訂閱它,它被調用。

對於你正在努力實現我會用Observable.deferdocs

將推遲運營商將等待觀察訂閱它,然後它會產生可觀察到的,通常可觀察到的工廠函數。

的代碼看起來是這樣的:

Observable<MyObject> observable = Observable.defer(new Func0<Observable<MyObject>>() { 
    @Override 
    public Observable<MyObject> call() { 

     System.out.println(Looper.myLooper() + " - " + Looper.getMainLooper()); 

     try { 
      MyObject myObject = new MyObject(); 
      return Observable.just(myObject); 
     } 
     catch (Exception e) { 
      return Observable.error(e); 
     } 

    } 
}); 

Subscription s = observable 
     .subscribeOn(Schedulers.newThread()) 
     .observeOn(AndroidSchedulers.mainThread()) 
     .subscribe(
       new Action1<MyObject>() { 
        @Override 
        public void call(MyObject myObject) { 

        } 
       }, 
       new Action1<Throwable>() { 
        @Override 
        public void call(Throwable throwable) { 
         throwable.printStackTrace(); 
        } 
       } 
     ); 

現在您的logcat的你將得到:

I/System.out: null - Looper (main, tid 1) {5282c4e0} 

Looper.myLooper()函數返回空值的原因是,當你創建一個新的線程除非你打電話Looper.prepare()線程不會有活套。除非你想發佈Runnable,否則你通常不需要在線程中使用活套。

+0

嘿。抱歉。已經離開了一段時間。我今晚會嘗試一下,回到你身邊:) –