EventBus的使用之post和postSticky的区别

post和postSticky的区别

post

  1. 找到当前线程的发布事件队列,将当前事件对象加入到队列中
  2. 如果当前线程为开始发布,则开启while循环,将队列中的所有事件发布,若已经在发布中了则不用理会
  3. 事件发布先根据当前事件类型找到其所有订阅信息(包含订阅者和订阅方法)集合,然后对集合中所有订阅信息进行事件发布
  4. 每个订阅信息的事件发布根据不同的threadMode切换到不同线程,通过反射调用订阅信息里的调用者的订阅方法

postSticky

  1. 将当前粘性事件保存下来,等后面注册该粘性事件的订阅者注册时发送给他
  2. 调用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

猜你喜欢

转载自blog.csdn.net/weixin_42602900/article/details/127788140