想用rxjava+rxandroid 替换handle实现数字时钟,出现无响应,不能隔一秒调用onNext

3 篇文章 0 订阅
2 篇文章 0 订阅

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!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值