初识 Eventbus

EventBus 听起来好像很厉害的样子:哪么他是用来干什么的呢?


EventBus 是一个通信框架,,,线程与线程之间的通信,在认识它之前是用Handler来进行通信的.

EventBus是一款针对Android的publish/subscribe(发布 / 订阅)消息事件总线,它简化了组件之间的通信,使我们的应用程序更加简单、通信更加快捷。



再来看看它的组成

EventBus事件主线由四大部分组成:

  • Publisher发布者:用于分发我们的Event事件,在EventBus中通过post方法进行分发传送。
  • Subscriber订阅者:用于接受我们的事件,我们在订阅事件中处理我们接收的数据。订阅事件有四种,都是以onEvent开发。
  • Event事件:任何一个对应都可以作为事件,比如任何字符串,事件是发布者和订阅者之间的通信载体。
  • EventBus:类似于中转站,将我们的事件进行对应的分发处理。


Subscriber的ThreadMode

EventBus中的Subscriber有四种订阅函数。

  • onEvent:使用onEvent作为订阅函数,则事件在哪个线程发布出来的,onEvent就会在这个线程中运行,也就是说发布事件和接收事件线程在同一个线程。使用这个方法时,在onEvent方法中不能执行耗时操作,如果执行耗时操作容易导致事件分发延迟。
  • onEventMainThread:使用onEventMainThread作为订阅函数,则不论事件是在哪个线程中发布出来的,onEventMainThread都会在UI线程中执行,接收事件就会在UI线程中运行,这个在Android中是非常有用的,因为在Android中只能在UI线程中跟新UI,所以在onEvnetMainThread方法中是不能执行耗时操作,不然引起ANR异常。
  • onEventBackground:使用onEventBackgrond作为订阅函数,如果事件是在UI线程中发布出来的,那么onEventBackground就会在子线程中运行,如果事件本来就是子线程中发布出来的,那么onEventBackground函数直接在该子线程中执行。
  • onEventAsync:使用这个函数作为订阅函数,那么无论事件在哪个线程发布,都会创建新的子线程在执行onEventAsync.

分析以上四种ThreadMode,我们可以明显发现上面四种类型就是为了解决我们的组件之间通信,举个例子,以往我们开启一个子线程进行download,然后通过Hanlder进行发布消息在UI线程中更新我们的UI组件。、



、EventBus的使用步骤

使用快捷键shift+Ctrl+Alt+S然后添加依赖   搜索EventBus3.0进行导入依赖


我们在Activity的onCreate()方法中进行注册:


 EventBus.getDefault().register(this);


在onDestroy()方法中进行反注册:

  
 protected void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);
    }




根据我们的需要进行一种接收处理即可。例如:


 public void onEvent(EventText eventText){
        tv_textTextView.setText(eventText.getText());
    }



这些是EventBus的最基本使用步骤,我们先来概括性的总结几个方法:

  • EventBus.getDefault().register(Object subscriber):注册EventBus
  • EventBus.getDefault().unregister(Object subscriber):反注册EventBus
  • EventBus.getDefault().post(Object event):发送消息事件
  • public void onEvent*****(Object event):消息接收处理
  • EventBus.getDefault().registerSticky(Object subscriber):粘性EventBus注册,用在此种情况消息先发送,后注册订阅者,如果使用register,会导致我们接收不到消息。


  Intent通过跳转时,intent.put跳转到第二个Activitiy,在第二个Activity中 通过getIntent().getxxx来进行Activity之间的数据交流.而EventBus则是通过一个post方法来使其他注册过EventBus的类来得到数据.相对来说,EventBus的结构更方便于数据的传递,因为他的post方法传递的是一个对象(一个Javaben),我们可以根据需求去定义这个JavaBean的成员变量,可以放集合,基本数据类型等.而在数据的传递之间可以通过简单的set,get方法来进行.简化了数据传递的逻辑.并且接收消息的这个在onCreate()方法之前调用



可以反注册  即释放资源   优化资源至关重要


注意:Event只是线程间的通信,并不能进行进程间的通信.




MainAcivity

public class MainActivity extends Activity {

        Button btn;
        TextView tv;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

            EventBus.getDefault().register(this);

            btn = (Button) findViewById(R.id.btn_try);
            tv = (TextView)findViewById(R.id.tv);

            btn.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    Intent intent = new Intent(getApplicationContext(),
                            SecondActivity.class);
                    startActivity(intent);
                }
            });
        }
        @Subscribe
        public void aa(EventBusMessage event) {

            String msg = "aa" + event.getMessage();
            Log.d("harvic", msg);
            tv.setText(msg);
            Toast.makeText(this, msg, Toast.LENGTH_LONG).show();
        }

        @Override
        protected void onDestroy(){
            super.onDestroy();
            EventBus.getDefault().unregister(this);
        }
    }


容器类
public class EventBusMessage {
    //定义了发送类型
    public String Message;

    //有参构造
    public EventBusMessage(String message) {
        Message = message;
    }

    //写一个GET方法
    public String getMessage() {
        return Message;
    }
}

SecondActivity
public class SecondActivity extends AppCompatActivity {

    private Button btn_FirstEvent;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        btn_FirstEvent = (Button) findViewById(R.id.btn_first_event);

        btn_FirstEvent.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                EventBus.getDefault().post(
                        new EventBusMessage("FirstEvent btn clicked"));
            }
        });
    }

}

MainXML
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:tools="http://schemas.android.com/tools"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical">

    <Button
        android:id="@+id/btn_try"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="btn_bty"/>
    <TextView
        android:id="@+id/tv"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"/>

</LinearLayout>
activity_second.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_second"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.anadministrator.eventbus.SecondActivity">
    <Button
        android:id="@+id/btn_first_event"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="First Event"/>
</RelativeLayout>





/
接下来是粘性事件的代码
效果:第一个Activity发消息,点击跳转到第二个Activity接收到消息并吐司
//EventBus消息类,一个容器,负责存放一些数据,方便另一个订阅者(接受者),获取消息
public class EventMessage {
    //定义发送的数据类型
    public  String  message;

    //有参构造
    public EventMessage(String message) {
        this.message = message;
    }

    //get方法
    public String getMessage() {
        return message;
    }
    List<String> list;

    public List<String> getList() {
        return list;
    }

    public void setList(List<String> list) {
        this.list = list;
    }
}
MainActivity
public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private Button butJump;
    private Button mBtnTry;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();


    }

    private void initView() {
        butJump = (Button) findViewById(R.id.butJump);
        butJump.setOnClickListener(this);
        mBtnTry = (Button) findViewById(R.id.butSend);
        mBtnTry.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.butJump:
                startActivity(new Intent(MainActivity.this, Main2Activity.class));
                break;
            case R.id.butSend:

                EventMessage message = new EventMessage("发消息到Main2");
                EventBus.getDefault().postSticky(message);
                break;
        }


    }
}
Main2Activity
public class Main2Activity extends AppCompatActivity {
    /**
     * 收到的消息:
     */
    private TextView mTv;
    /**
     * 跳转到第三个Activity
     */
    private Button mButTo3;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        initView();
        EventBus.getDefault().register(this);
    }



    @Subscribe(sticky = true)
    public void onEventMainThread(EventMessage event) {
        System.out.println("onEventMainThread");
        String msg = "onEventMainThread收到了消息:" + event.getMessage();
        mTv.setText(msg);
        Toast.makeText(this, msg, Toast.LENGTH_LONG).show();
    }

    private void initView() {
        mTv = (TextView) findViewById(R.id.tv);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().removeAllStickyEvents();
        EventBus.getDefault().unregister(this);
    }

}
activity_mainXml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    >

    <Button
        android:layout_centerInParent="true"
        android:id="@+id/butJump"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="跳转到第二个Activity"/>
    <Button
        android:layout_below="@id/butJump"
        android:layout_centerInParent="true"
        android:id="@+id/butSend"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="发消息"/>
</RelativeLayout>

activity_main2.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main2"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    >
    <TextView
        android:id="@+id/tv"
        android:text="收到的消息:"
        android:textSize="20sp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    <TextView
        android:id="@+id/tvvv"
        android:text="这里是第二个Activity"
        android:layout_centerInParent="true"
        android:textSize="20sp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

</RelativeLayout>













  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于协同过滤、矩阵分解、gvdt+lr、wide&deep等算法的推荐模型python实现源码含项目说明+数据集.zip 推荐算法的实现,python、jupyter双版本,详尽注释。 正在努力更新中... #### 对MovieLens电影评分小型数据集做Top N推荐: 0. baseline--推荐最热门的N=20部电影,precision=11%, recall=4%, coverage=0.2%, popularity=169。这部分内容包含在UserCF.py 1. UserCF,precision=25%, recall=10%, coverage=10%, popularity=4.4 2. ItemCF,precision=26%, recall=10%, coverage=15%, popularity=4.3 #### 对MovieLens电影评分小型数据集做评分预测: 0. baseline--使用所有评分的均值做预测,MAE:0.83。这部分内容包含在LinearRegression_Rating.ipynb 1. BiasSVD,MAE:0.68 2. LinearRegression,MAE:0.61 #### 对criteo广告展示小型数据集做点击率预测 1. gbdt+lr,binary_logloss:0.4783 #### 对Census数据中的收入做二分类 0. Google TensorFlow Guide上的Wide&Deep基准模型准确率: 0.83。(从有的知乎博主分享的链接来看,已经打不开了) 1. Wide&Deep, accuracy: 0.8587
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于C++实现的连接池、线程池、内存池、对象池项目源码含项目说明.zip ## CPP连接池 ### 关键技术点 MySQL数据库编程、单例模式、queue队列容器、C++11多线程编程、线程互斥、线程同步通信和 unique_lock、基于CAS的原子整形、智能指针shared_ptr、lambda表达式、生产者-消费者线程模型 ## CPP线程池 ### 关键技术点 作为五大池之一(内存池、连接池、线程池、进程池、协程池),线程池的应用非常广泛,不管是客户 端程序,还是后台服务程序,都是提高业务处理能力的必备模块。有很多开源的线程池实现,虽然各自 接口使用上稍有区别,但是其核心实现原理都是基本相同的。 ## CPP内存池 ### 关键技术点 读一下STL和nginx的内存池实现,并且单单的内存池的地方项目提取出来,方便后面对于不同类型的内存池进行分析 ## 对象池 ### 关键技术点 对于new和delete,malloc和free的源码进行阅读,对于创建对象需要多次创建和释放的的情况实现一个对象池 实现的方案使用Queue进行创建

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值