正确使用 Observable (RxJava)
Proper use of Observable (RxJava)
我已经在使用 RxJava
+ Retrofit
+ EventBus
。效果很好!
但我不完全理解如何使用 Rx Observable
如此简单 AsyncTask
。
我会稍微解释一下:
例如我有一个方法,我想在后台执行(而不是在 UI 线程中):
public void teachMe() {
for(int i=0;i< daysUntilGenius;i++){
Log.e("WORK DAY" , String.valueOf(i));
}
}
当这个方法完成时,我想切换到主线程并显示 toast 或其他东西。
使用 AsynсTask 我可以简单地使用方法 doInBackground
和 onPostExecute
来完成,但我想使用 Rx Observable
和 Subscriber
来完成。
我已经使用过调度程序,所以我知道如何在线程之间切换,我只是不知道如何将所有这些放在一起并使其工作!
我需要示例或代码片段,并进行一些解释,谢谢!
您可以尝试这样的操作:
public void doAsyncStuff(int days) {
Observable
.just(days)
.subscribeOn(Schedulers.newThread())
.doOnEach(n -> teachMe(n))
.observeOn(AndroidSchedulers.mainThread())
.subscribe(n -> Log.i("Completed " + n));
}
public void teachMe(int daysUntilGenius) {
for(int i = 0; i < daysUntilGenius; i++){
Log.e("WORK DAY", String.valueOf(i));
}
}
最后我找到了解决方案:
public Subscription test(final int days){
return Observable.create(new Observable.OnSubscribe<Void>() {
@Override
public void call(Subscriber<? super Void> subscriber) {
teachMe(days);
subscriber.onCompleted();
}
})
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Void>() {
@Override
public void onCompleted() {
Toast.makeText(MainActivity.this.getApplicationContext(),"COMPLETE",Toast.LENGTH_LONG).show();
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Void aVoid) {
}
});
}
public void teachMe(int days) {
for(int i=0;i< daysUntilGenius;i++){
Log.e("WORK DAY" , String.valueOf(i));
}
}
我已经在使用 RxJava
+ Retrofit
+ EventBus
。效果很好!
但我不完全理解如何使用 Rx Observable
如此简单 AsyncTask
。
我会稍微解释一下:
例如我有一个方法,我想在后台执行(而不是在 UI 线程中):
public void teachMe() {
for(int i=0;i< daysUntilGenius;i++){
Log.e("WORK DAY" , String.valueOf(i));
}
}
当这个方法完成时,我想切换到主线程并显示 toast 或其他东西。
使用 AsynсTask 我可以简单地使用方法 doInBackground
和 onPostExecute
来完成,但我想使用 Rx Observable
和 Subscriber
来完成。
我已经使用过调度程序,所以我知道如何在线程之间切换,我只是不知道如何将所有这些放在一起并使其工作!
我需要示例或代码片段,并进行一些解释,谢谢!
您可以尝试这样的操作:
public void doAsyncStuff(int days) {
Observable
.just(days)
.subscribeOn(Schedulers.newThread())
.doOnEach(n -> teachMe(n))
.observeOn(AndroidSchedulers.mainThread())
.subscribe(n -> Log.i("Completed " + n));
}
public void teachMe(int daysUntilGenius) {
for(int i = 0; i < daysUntilGenius; i++){
Log.e("WORK DAY", String.valueOf(i));
}
}
最后我找到了解决方案:
public Subscription test(final int days){
return Observable.create(new Observable.OnSubscribe<Void>() {
@Override
public void call(Subscriber<? super Void> subscriber) {
teachMe(days);
subscriber.onCompleted();
}
})
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Void>() {
@Override
public void onCompleted() {
Toast.makeText(MainActivity.this.getApplicationContext(),"COMPLETE",Toast.LENGTH_LONG).show();
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Void aVoid) {
}
});
}
public void teachMe(int days) {
for(int i=0;i< daysUntilGenius;i++){
Log.e("WORK DAY" , String.valueOf(i));
}
}