2015-07-19 50 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 
}