2015-07-19 116 views
5

我用無窮大progres欄創建了簡單的活動,並且我嘗試使用RxJava運行耗時的方法來防止UI線程被阻塞,但是每次UI線程都被阻塞。我認爲我的解決方案在發射Observable方面存在問題。誰能幫我?我在RX上跑步。AndroidRX - 後臺運行方法

public class MainActivity extends AppCompatActivity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
} 

public void doSomething(View view) { 
    doHeavyStuff() 
      .subscribeOn(Schedulers.newThread()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .doOnNext(new Action1() { 
       @Override 
       public void call(Object o) { 
        Toast.makeText(getApplicationContext(), "FINISHED", Toast.LENGTH_SHORT).show(); 
       } 
      }) 
      .subscribe(); 
} 

private Observable doHeavyStuff() { 
    for (int i = 0; i < 999999999; i++) { 
     for (int j = 0; j < 2; j++) { 
     } 
    } 
    return Observable.just(1); 

} 

回答

8

你doHeavyStuff()調用上的線程執行計算,你只需換你結果到觀測。 爲了包裝計算到可觀察到的,你應該使用通過subscribeOnobserveOn推遲

Observable.defer(new Func0<Observable<Integer>>() { 
    @Override 
    public Observable<Integer> call() { 
     return Observable.just(doHeavyStuff()); 
    } 
}); 

,那麼你可以指定線程方法

1

此外,您還可以使用RxJavaAsyncUtil

compile 'io.reactivex:rxjava-async-util:0.21.0' 

代碼:

Observable.fromFunc0(() -> doHeavyStuff()) 
7

根據docs

已過時: fromFunc0 不必要現在Func0擴展可贖回。只需調用fromCallable(java.util.concurrent.Callable)即可。

所以,你可以撥打電話以這樣的方式

Observable.fromCallable(new Callable<Object>() { 
      @Override 
      public Object call() throws Exception { 
       return someMethod(); 
      } 
     }).subscribeOn(Schedulers.io()) 
       .observeOn(AndroidSchedulers.mainThread()).subscribe(new Action1<Object>() { 
        @Override 
        public void call(Object object) { 

        } 
       }); 
3

在RxJava2一個可能的解決方案是:

版本與lambda表達式:

Single.fromCallable(() -> loadInBackground()) 
    .subscribeOn(Schedulers.io()) 
    .observeOn(AndroidSchedulers.mainThread()) 
    .subscribe((myObject) -> { updateUi(myObject) }); 

版本不lambda表達式:

Single.fromCallable(new Callable<Object>() { 
    @Override 
    public Object call() throws Exception { 
     return loadInBackground(); 
    } 
}) 
.subscribeOn(Schedulers.io()) 
.observeOn(AndroidSchedulers.mainThread()) 
.subscribe(new Consumer<Object>() { 
    @Override 
    public void accept(Object myObject) throws Exception { 
     updateUi(myObject); 
    } 
}); 

實施例的方法:

private Object loadInBackground() { 
    // some heavy load code 
    return myObject; 
} 

private void updateUi(Object myObject) { 
    // update your Views here 
}