post和postSticky的区别
post
- 找到当前线程的发布事件队列,将当前事件对象加入到队列中
- 如果当前线程为开始发布,则开启while循环,将队列中的所有事件发布,若已经在发布中了则不用理会
- 事件发布先根据当前事件类型找到其所有订阅信息(包含订阅者和订阅方法)集合,然后对集合中所有订阅信息进行事件发布
- 每个订阅信息的事件发布根据不同的threadMode切换到不同线程,通过反射调用订阅信息里的调用者的订阅方法
postSticky
- 将当前粘性事件保存下来,等后面注册该粘性事件的订阅者注册时发送给他
- 调用post发送事件
主要事件:
发消息的主要方法:
EventBus.getDefault().postSticky(new FirstEvent("有一条消息"));
接收消息页面需要先注册事件
EventBus.getDefault().register(this);
接收消息重写onEventMainThread方法(方法名字可以自定义)但是一定注意需要写@Subscribe
@Subscribe(threadMode = ThreadMode.MAIN,sticky = true)
public void onEventMainThread(FirstEvent event) {
}
EvenBus之post的使用
在第一个页面注册,第二页面发送消息,首页登录后返回首页。
package com.zsn.eventbus;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
public class MainActivity extends AppCompatActivity {
Button btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
EventBus.getDefault().register(this);
btn=findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(getApplicationContext(),SecondActivity.class);
startActivity(intent);
}
});
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEventMainThread(FirstEvent event) {
String msg = "onEventMainThread收到了消息:" + event.getmMsg();
Log.i("消息", " "+msg);
}
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
}
第二个页面
package com.zsn.eventbus;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
public class SecondActivity extends AppCompatActivity {
Button btn;
TextView tv;
String msg="aaa";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
//EventBus.getDefault().register(this);
tv=findViewById(R.id.tv);
btn=findViewById(R.id.sec_bnt);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EventBus.getDefault().post(new FirstEvent("\"有一个好消息!\""));
Intent intent=new Intent(getApplicationContext(),MainActivity.class);
startActivity(intent);
}
});
}
}
EvenBus之postSticky的使用
主页面给第二页面发消息
package com.zsn.eventbus;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
public class MainActivity extends AppCompatActivity {
Button btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn=findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(getApplicationContext(),SecondActivity.class);
startActivity(intent);
EventBus.getDefault().postSticky(new FirstEvent("有一条消息"));
}
});
}
}
消息的类型
package com.zsn.eventbus;
public class FirstEvent {
private String mMsg;
public FirstEvent(String mMsg) {
this.mMsg = mMsg;
}
public String getmMsg() {
return mMsg;
}
public void setmMsg(String mMsg) {
this.mMsg = mMsg;
}
}
第二页面接受消息
package com.zsn.eventbus;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
public class SecondActivity extends AppCompatActivity {
Button btn;
TextView tv;
String msg="aaa";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
EventBus.getDefault().register(this);
tv=findViewById(R.id.tv);
btn=findViewById(R.id.sec_bnt);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
tv.setText(msg);
}
});
}
@Subscribe(threadMode = ThreadMode.MAIN,sticky = true)
public void onEventMainThread(FirstEvent event) {
msg = "onEventMainThread收到了消息:" + event.getmMsg();
Log.i("消息", " "+msg);
}
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
}
————————————————
转载于:https://blog.csdn.net/qq_40283135/article/details/108085405