EventBus使用记录(一)

    xiaoxiao2021-03-25  157

    摘要:EventBus是在看一个开源项目时,偶然之间看到这个框架,不认识,遂学习之,并记录下来。

    概述

    EventBus 是一个事件发布和订阅的轻量级框架。通过解耦发布者和订阅者简化Android事件传递 。可以代替Android传统的Intent,Handler,Broadcast或接口函数,在Fragment,Activity,Service线程之间传递数据,执行方法,代码简洁明了。

    导入方式

    compile ‘org.greenrobot:eventbus:3.0.0’

    常用方法

    1、定义事件类型(此处为一个自定义类)

    public class FirstMessageEvent { private String msg; public FirstMessageEvent(String msg) { this.msg = msg; } public String getMsg() { return msg; } }

    2、订阅者注册及解绑

    //注册 EventBus.getDefault().register(this); //解绑 EventBus.getDefault().unregister(this);

    3、订阅者接收事件

    //org.greenrobot:eventbus:3.0.0 已改为自定义接收事件方法 @Subscribe(threadMode = ThreadMode.POSTING) public void onMyEvent(MessageEvent event) { String msg = "收到:" + event.getMsg(); Log.d("recive msg", msg); }

    4、发送者发送事件

    EventBus.getDefault().post( new FirstMessageEvent("send msg"));

    下面先来个简单例子,这个例子,作为替换线程调用Handle实现刷新界面,来熟悉EventBus操作。

    一个简单示例

    1、创建activity - 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:layout_width="match_parent" android:layout_height="match_parent" tools:context="orderandcasher.langge.com.ormlitetext.MainActivity"> <Button android:id="@+id/btn_1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="启动线程发送消息" /> <TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="显示" android:layout_centerInParent="true"/> </RelativeLayout> java文件 public class MainActivity extends AppCompatActivity { private Button button_1; private TextView textView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = (TextView)findViewById(R.id.text); button_1 = (Button)findViewById(R.id.btn_1); button_1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { } }); } }

    2、创建事件类 简单构造一个数据结构

    public class FirstMessageEvent { private String msg; public FirstMessageEvent(String msg) { this.msg = msg; } public String getMsg() { return msg; } }

    3、订阅者注册和解绑

    @Override public void onStart() { super.onStart(); EventBus.getDefault().register(this); } @Override public void onStop() { EventBus.getDefault().unregister(this); super.onStop(); }

    也可以在onCreate中注册,在onDestroy解绑,看情况而定。

    4、订阅者自定义函数接收事件

    //接收事件,UI线程执行 @Subscribe(threadMode = ThreadMode.MAIN) public void onMyEvent(FirstMessageEvent event){ String msg = "在UI主线程中收到消息:" + event.getMsg(); Log.d("recive msg", msg); textView.setText(msg); Toast.makeText(getApplicationContext(), "lala:"+msg, Toast.LENGTH_SHORT).show(); }

    EventBus 包含4个ThreadMode: - ThreadMode.POSTING:默认使用该模式,表示该方法会在当前发布事件的线程执行 - ThreadMode.MAIN:表示会在UI线程中执行 - ThreadMode.BACKGROUND:若当前线程非UI线程则在当前线程中执行,否则加入后台任务队列,使用线程池调用 - ThreadMode.ASYNC:加入后台任务队列,使用线程池调用

    5、发送者发送事件

    button_1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //开启线程发送事件 new Thread(new Runnable() { @Override public void run() { EventBus.getDefault().post( new FirstMessageEvent("骚年,给我刷新显示内容吧"+ new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()).format(new Date()) ) ); } }).start(); } });

    完整activity代码:

    public class MainActivity extends AppCompatActivity { private Button button_1; private TextView textView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); EventBus.getDefault().register(this);//注册 textView = (TextView)findViewById(R.id.text); button_1 = (Button)findViewById(R.id.btn_1); button_1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //开启线程发送事件 new Thread(new Runnable() { @Override public void run() { //send event EventBus.getDefault().post( new FirstMessageEvent("骚年,给我刷新显示内容吧"+ new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()).format(new Date()) ) ); } }).start(); } }); } //接收事件,当前发布事件的线程执行 /* @Subscribe public void onEventThread(FirstMessageEvent event) { String msg = "在发送者的线程中收到消息:" + event.getMsg(); Log.d("recive msg", msg); textView.setText(msg); // 非ui线程不能操作控件 }*/ //接收事件,UI线程执行 @Subscribe(threadMode = ThreadMode.MAIN) public void onMyEvent(FirstMessageEvent event){ String msg = "在UI主线程中收到消息:" + event.getMsg(); Log.d("recive msg", msg); textView.setText(msg); Toast.makeText(getApplicationContext(), "lala:"+msg, Toast.LENGTH_SHORT).show(); } @Override protected void onDestroy() { super.onDestroy(); EventBus.getDefault().unregister(this);//解绑 } }

    参考

    想了解EventBus,下面2篇文章真的很不错,强烈推荐 1、http://blog.csdn.net/harvic880925/article/details/40660137 2、http://blog.csdn.net/wl1769127285/article/details/51065015 3、EventBus Github源码

    转载请注明原文地址: https://ju.6miu.com/read-4331.html

    最新回复(0)