package com.example.testrxandroid;
import rx.Observable;
import rx.Observable.OnSubscribe;
import rx.android.schedulers.AndroidSchedulers;
import rx.Scheduler;
import rx.Subscriber;
import rx.schedulers.Schedulers;
import android.support.v7.app.ActionBarActivity;
import android.text.format.DateFormat;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends ActionBarActivity {
TextView textView;
Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.textView1);
button = (Button) findViewById(R.id.button1);
final Observable<String> observable = Observable
.create(new OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
// TODO Auto-generated method stub
while (true) {//循环
try {
Thread.sleep(1000);//隔1s
subscriber.onNext(DateFormat.format(
"yyyy年MM月dd日 hh:mm:ss",
System.currentTimeMillis()).toString());//返回当前时间
subscriber.onCompleted();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}).observeOn(Schedulers.newThread()) //计时放在子线程
.subscribeOn(AndroidSchedulers.mainThread());//界面UI放在主线程
final Subscriber<String> subscriber = new Subscriber<String>() {
@Override
public void onCompleted() {
// TODO Auto-generated method stub
}
@Override
public void onError(Throwable throwable) {
// TODO Auto-generated method stub
}
@Override
public void onNext(String str) {
// TODO Auto-generated method stub
Log.d("lihui", "time---" + str);
textView.setText(str);
}
};
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
observable.subscribe(subscriber);
}
});
}
}
问题:
发现界面点击button 直接无响应了。
难道rxandroid不能循环调用onnext???
分析log发现线程阻塞,导致无响应。
代码涉及到线程的地方只有2处:
observeOn(Schedulers.newThread())
subscribeOn(AndroidSchedulers.mainThread() );
一定是这里出了问题。
网上查到observeOn是对应call()方法,
耗时操作,所以是
Schedulers.newThread();
subsubscribeOn对应onNext(),
所以是主线程 ,更新UI界面。
误人子弟啊!!!其实正常相反!!!!!
.subscribeOn(Schedulers.io()) //指定 subscribe() 发生在 IO 线程,子线程,对应call()
.observeOn( AndroidSchedulers.mainThread() ) //指定 Subscriber 的回调发生在主线程,对应onNext()
修改
为
.observeOn(AndroidSchedulers.mainThread()) 主线程
.subscribeOn(Schedulers.newThread()); new子线程、io线程
发现界面只更新一次!!!
尼玛,什么情况???
发现代码有个
subscriber.onCompleted(); 监听完成。观察者循环不再继续,退出
去掉后,显示正常!!!ok
使用rxjava+rxandroid 实现了数字时钟!!!
停止订阅:
订阅者定义:
Subscriber subscriber
或者
Observer observer
如果你是使用了observable+Subscriber
1 observable
2 Subscriber
3 observer
注:
Subscriber subscriber;
subscription=observable.subscribe(subscriber);
subscription.unsubscribe();
再次订阅:
observable.subscribe(subscriber);
尼玛,发现没有效果!!!
解决方法是订阅者使用 Observer observer 来定义
1)subscription = observable.subscribe(observer);
2)subscription.unsubscribe();
再次订阅
subscription = observable.subscribe(observer);
生效。
也就是说使用了subscriber作为订阅者,那么你取消订阅后,无法再次订阅,只能订阅一次!!!
如果你想取消后可以重复订阅,使用observer!!!