使用eventbus来管理线程
Posting
“”“订阅方和发送方在同一线程中执行”
@Subscribe(threadMode = ThreadMode.POSTING)
public void onPostingEvent(final PostingEvent event){
final String threadinfo = Thread.currentThread().toString();//主要是看和发布方的是不是在一个线程里面
runOnUiThread(new Runnable() {
@Override
public void run() {
setPublisherThreadInfo(event.Threadinfo);//发布方的线程
setSubscriberThreadInfo(threadinfo);//如果不是先写好的,就会一直显示main线程
}
});
}
@Override
protected void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Override
protected void onStop() {
super.onStop();
EventBus.getDefault().unregister(this);
}
private void setTextView(int resId, String text) {
final TextView textView = (TextView) findViewById(resId);
textView.setText(text);
textView.setAlpha(.5f);
textView.animate().alpha(1).start();
}
private void setPublisherThreadInfo(String threadInfo) {
setTextView(R.id.publisherThread, threadInfo);
}
private void setSubscriberThreadInfo(String threadInfo) {
setTextView(R.id.subscriberThread, threadInfo);
}
首先是在onstart中注册onstop中解绑,且构造订阅和回调函数
在另一个fragment中发布函数
case 2:
if (Math.random() > .5) {
new Thread("posting--002") {
@Override
public void run() {
super.run();
EventBus.getDefault().post(new PostingEvent(Thread.currentThread().toString()));
}
}.start();
} else {
EventBus.getDefault().post(new PostingEvent(Thread.currentThread().toString()));
}
break;
这里给了一个随机数,让他在普通线程和主线程中随机运行
看结果
多试几次发现无论是在发布方是在主线程还是普通线程,订阅方都会和发布方在一个线程里面
@Main
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMainEvent(MainEvent event){
final String threadinfo = Thread.currentThread().toString();
setPublisherThreadInfo(event.threadinfo);
setSubscriberThreadInfo(threadinfo);
}
在Activity中的代码
if (Math.random() > .5) {
new Thread("working") {
@Override
public void run() {
super.run();
EventBus.getDefault().post(new MainEvent(Thread.currentThread().toString()));
}
}.start();
} else {
EventBus.getDefault().post(new MainEvent(Thread.currentThread().toString()));
}
}
在fragment中的代码
无论是在发布方是在主线程还是普通线程,订阅方都是在主线程中运行
MAIN_ORDERED
@Subscribe(threadMode = ThreadMode.MAIN_ORDERED)
public void onMainOrderEvent(MainOrderEvent event){
Log.d(TAG, "onMainOrderEvent:enter "+ SystemClock.uptimeMillis());
final String threadinfo = Thread.currentThread().toString();
setPublisherThreadInfo(event.threadinfo);
setSubscriberThreadInfo(threadinfo);
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.d(TAG, "onMainOrderEvent:exit "+ SystemClock.uptimeMillis());
}
Log.d(TAG, "onMainOrderEvent:before "+ SystemClock.uptimeMillis());
EventBus.getDefault().post(new MainOrderEvent(Thread.currentThread().toString()));
Log.d(TAG, "onMainOrderEvent:after "+ SystemClock.uptimeMillis());
和Main一样都是在主线程中,不同的就是不需要等带订阅方完成订阅,发布方就可以继续自己的代码运行
同样的代码当使用Main时
当使用Mainoreder时
BackGround
@Subscribe(threadMode = ThreadMode.BACKGROUND)
public void onBackGroundEvent(final BackGroundEvent event){
final String threadinfo = Thread.currentThread().toString();
runOnUiThread(new Runnable() {//只要有可能不是在ui线程里的发送者,那么接收时就必须在ui线程里
@Override
public void run() {
setPublisherThreadInfo(event.threadinfo);
setSubscriberThreadInfo(threadinfo);
}
});
}
订阅方不在主线程里运行
ASYNC
@Subscribe(threadMode = ThreadMode.ASYNC)
public void onAsyncEvent(final AsyncEvent event){
final String threadinfo = Thread.currentThread().toString();
runOnUiThread(new Runnable() {//只要有可能不是在ui线程里的发送者,那么接收时就必须在ui线程里
@Override
public void run() {
setPublisherThreadInfo(event.threadinfo);
setSubscriberThreadInfo(threadinfo);
}
});
}
同样不会在主线程里运行但是他是重写创建一个新的线程去完成订阅