Rxandroid中doOnSubscribe()执行默认情况下所在的线程

本文详细探讨了在RxAndroid中doOnSubscribe()操作符的默认执行线程,解释了它在订阅过程中的作用以及如何影响线程切换。通过对订阅流程的分析,理解在不同场景下doOnSubscribe()的线程行为,为优化Android应用的异步处理提供参考。
public class MainActivity extends AppCompatActivity {
    Button btn;
    TextView txt;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn = (Button) findViewById(R.id.btn);
        txt = (TextView) findViewById(R.id.txt);
        txt.setVisibility(View.GONE);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                test();
            }
        });
    }

    private String name0 = null;
    private String name1 = null;
    private String name2 = null;
    private String nameInThread = null;
    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if (msg.what == 0) {
                Toast.makeText(getApplicationContext(), name0, Toast.LENGTH_SHORT).show();
            } else if (msg.what == 1){
                Toast.makeText(getApplicationContext(), name1, Toast.LENGTH_SHORT).show();
            }else if (msg.what == 2){
                Toast.makeText(getApplicationContext(), name2, Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(getApplicationContext(), nameInThread, Toast.LENGTH_SHORT).show();
            }
        }
    };

    /**
     * 默认情况下subcribe发生的线程决定了,doOnSubscribe()执行所在的线程。
     * 这里nameInThread和name0的值是相等的。都是在同一个子线程中执行,这里就是new Thread()这个线程。
     */
    private void test() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                nameInThread = "nameInThread:" + Thread.currentThread().getName();
                handler.sendEmptyMessage(0x99);

                Observable.create(new Observable.OnSubscribe<Integer>() {
                    @Override
                    public void call(Subscriber<? super Integer> subscriber) {
                        subscriber.onNext(2323);
                        name2 = "name2:" + Thread.currentThread().getName();
                        handler.sendEmptyMessage(2);
                    }
                }).subscribeOn(Schedulers.io())
                        .doOnSubscribe(new Action0() {
                            @Override
                            public void call() {
                                name0 = "name0:" + Thread.currentThread().getName();
                                handler.sendEmptyMessage(0);
                            }
                        })
                        .observeOn(Schedulers.io())
                        .subscribe(new Action1<Integer>() {
                            @Override
                            public void call(Integer integer) {
                                name1 = "name1:" + Thread.currentThread().getName();
                                handler.sendEmptyMessage(1);
                            }
                        });
            }
        }).start();
    }
}


    private String name0 = null;
    private String name1 = null;
    private String name2 = null;
    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if (msg.what == 0) {
                Toast.makeText(getApplicationContext(), name0, Toast.LENGTH_SHORT).show();
            } else if (msg.what == 1) {
                Toast.makeText(getApplicationContext(), name1, Toast.LENGTH_SHORT).show();
            } else if (msg.what == 2) {
                Toast.makeText(getApplicationContext(), name2, Toast.LENGTH_SHORT).show();
            }
        }
    };

    /**
     * subcribe发生在main线程中,所以这里的name0的值就为main。也就是主线程中。
     */
    private void test() {
        Observable.create(new Observable.OnSubscribe<Integer>() {
            @Override
            public void call(Subscriber<? super Integer> subscriber) {
                subscriber.onNext(2323);
                name2 = "name2:" + Thread.currentThread().getName();
                handler.sendEmptyMessage(2);
            }
        }).subscribeOn(Schedulers.io())
                .doOnSubscribe(new Action0() {
                    @Override
                    public void call() {
                        name0 = "name0:" + Thread.currentThread().getName();
                        handler.sendEmptyMessage(0);
                    }
                })
                .observeOn(Schedulers.io())
                .subscribe(new Action1<Integer>() {
                    @Override
                    public void call(Integer integer) {
                        name1 = "name1:" + Thread.currentThread().getName();
                        handler.sendEmptyMessage(1);
                    }
                });
    }



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值