您的位置:首页 > 移动开发 > Android开发

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

2016-05-16 22:04 381 查看
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);
}
});
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: