EventBus 了解及应用
来源:互联网 发布:淘宝退款可以申请几次 编辑:程序博客网 时间:2024/06/13 17:00
标题:学习任务
EventBus是一款针对Android优化的发布/订阅事件总线。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息.优点是开销小,代码更优雅。以及将发送者和接收者解耦。
1.今天呢主要是定了一个学习任务,学习这个EventBus,也是查看一些相关的博客
具体参考了:http://blog.csdn.net/harvic880925/article/details/40660137
下载了相关的Moudle 然后到了下代码
具体的实现效果: 也是别人的图 效果也是这样
至于导完后并不能运行,提示加一个注解@Subscribe在接收信息的方法上
2.大致明白了EventBus 类似于Intent 传值.
Intent通过跳转时,intent.put跳转到第二个Activitiy,在第二个Activity中 通过getIntent().getxxx来进行Activity之间的数据交流.而EventBus则是通过一个post方法来使其他注册过EventBus的类来得到数据.相对来说,EventBus的结构更方便于数据的传递,因为他的post方法传递的是一个对象(一个Javaben),我们可以根据需求去定义这个JavaBean的成员变量,可以放集合,基本数据类型等.而在数据的传递之间可以通过简单的set,get方法来进行.简化了数据传递的逻辑.并且接收消息的这个在onCreate()方法之前调用
3.相对于参照博客的Demo,因为他是先跳转到第二个Activity,然后在返回到第一个Activity实现效果,本着方便于以后开发的想法,尝试做了一个Demo,想要的结果是:从第一个Activity跳转到第二个Activity时,直接接收到消息展示.
于是遇到了
翻译过来
D / EventBus:没有用户注册com.example.anadministrator.eventbus2.EventMessage事件类
D / EventBus:没有用户注册org.greenrobot.eventbus.NoSubscriberEvent事件类
于是搜了一些博客
使用粘性事件可以解决这个问题.
之前的发送方法是post,改为postSticky(),在注册了EventBus的类中接收信息的方法上,注解后面再加一句@Subcribe (Sticky=true),这个Sticky表示粘性事件的一个标识,默认是为false的,在这个改为true.只有标识为true的方法才会接收粘性事件.即接收PostSticky()方法发出的消息.
特点:
1.可以设置接收事件的优先级.
threadMode就是我们操作数据时的线程类型,这里一共有4个类型,分别是POSTING、MAIN、BACKGROUND和ASYNC.也可以使用priority=1-10来设置优先级
POSTING:
这个类型是和发布事件的一方处于同一个线程内不论是主线程还是子线程,所以这里需要注意,避免在主线程中进行耗时的操作。
MAIN:
这个类型是运行在主线程,可以进行一些子线程更新UI的操作,同样注意需要避免做一些耗时的操作。
BACKGROUND:
这个类型是运行在子线程,如果发布方是子线程,就直接在发布方的线程中执行操作,如果是主线程,就会重新开辟一个子线程,进行操作,同样避免做一些耗时操作。
ASYNC:
这个类型是异步操作,可以进行一些耗时的操作。
2.可以反注册 即释放资源 优化资源至关重要
注意:Event只是线程间的通信,并不能进行进程间的通信.
导入的依赖都是eventbus:3.0
Studio直接搜即可
代码
效果1:即上面的Gif效果
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; }}SecondActivitypublic 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消息类,一个容器,负责存放一些数据,方便另一个订阅者(接受者),获取消息MainActivity
public class MainActivity extends AppCompatActivity implements View.OnClickListener { /** * btn_bty */ private Button butJump; /** * btn_bty */ 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: List<String> list=new ArrayList<>(); for (int i = 0; i < 10; i++) { list.add("自定义数据"+i); } EventMessage message = new EventMessage("发消息到Main2"); message.setList(list); EventBus.getDefault().postSticky(message); break; } } @Override protected void onDestroy() { super.onDestroy(); }}
Main2Activitypublic class Main2Activity extends AppCompatActivity implements View.OnClickListener { /** * 收到的消息: */ 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); System.out.println("onCreate"); } @Override protected void onStart() { super.onStart(); System.out.println("onStart"); } @Subscribe(sticky = true) public void onEventMainThread(EventMessage event) { System.out.println("onEventMainThread"); String msg = "onEventMainThread收到了消息:" + event.getMessage(); List<String> list = event.getList(); mTv.setText("收到的消息:"+list.get(5)); Toast.makeText(this, msg, Toast.LENGTH_LONG).show(); } private void initView() { mTv = (TextView) findViewById(R.id.tv); mButTo3 = (Button) findViewById(R.id.butTo3); mButTo3.setOnClickListener(this); } @Override protected void onDestroy() { super.onDestroy(); EventBus.getDefault().removeAllStickyEvents(); EventBus.getDefault().unregister(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.butTo3: startActivity(new Intent(Main2Activity.this,Main3Activity.class)); break; } }}
Main3Activitypublic class Main3Activity extends AppCompatActivity { /** * 收到的消息: */ private TextView mTv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main3); initView(); EventBus.getDefault().register(this); System.out.println("onCreate"); } @Override protected void onStart() { super.onStart(); System.out.println("onStart"); } @Subscribe(sticky = true) public void onEventMainThread(EventMessage event) { System.out.println("onEventMainThread"); String msg = "onEventMainThread收到了消息:" + event.getMessage(); mTv.setText("收到的消息:"+event.getList().get(5)); Toast.makeText(this, msg, Toast.LENGTH_LONG).show(); } private void initView() { mTv = (TextView) findViewById(R.id.tv3); } @Override protected void onDestroy(){ super.onDestroy(); EventBus.getDefault().removeAllStickyEvents(); EventBus.getDefault().unregister(this); }}
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>
Main2XML
<?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"/> <Button android:id="@+id/butTo3" android:layout_below="@id/tvvv" android:text="跳转到第三个Activity" android:layout_centerHorizontal="true" android:layout_width="wrap_content" android:layout_height="wrap_content"/></RelativeLayout>
Main3XML
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 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/tv3" android:text="收到的消息3.:" android:textSize="20sp" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <TextView android:text="这里是第三个Activity" android:layout_centerInParent="true" android:textSize="20sp" android:layout_width="wrap_content" android:layout_height="wrap_content"/></RelativeLayout>容器类
//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; }}
完了注册一下Activity (如果你是粘的)
- EventBus 了解及应用
- EventBus 3.0 深入了解
- Eventbus的了解
- 了解@命令语法及应用
- Android EventBus深入了解实战
- 了解mongodb应用场景、限制及实践
- 了解echo命令语法及应用
- 消息队列的初步了解及应用
- 【应用组件:EventBus】开篇
- EventBus(四)-----简单应用
- Android-EventBus应用
- EventBus简介及使用
- EventBus使用及优点
- 了解EventBus 3.0 (一)-订阅流程
- 了解EventBus 3.0 (二)-发送事件
- 【应用组件:EventBus】实例演示
- EventBus--在ecmobile中的应用
- EventBus在项目中的应用
- Android自定义主题样式详解(结合自定义title栏讲解)
- vim的ex模式用法
- calico网络原理及与flannel对比
- 创建fragment实例
- 跟我学NodeJS(二)
- EventBus 了解及应用
- HTML标题前的图标logo
- WebSocket(一):Java Web项目使用Websocket
- Win10 迅雷9精简优化设置方法
- Android动画简单总结
- 文件查看工具
- 关于使用java调用海康威视的动态库的详细使用说明(即java调用海康威视SDK的方法)
- 爬豆瓣网分析《敦刻尔克》这部电影值得我们花钱去看吗(1)
- php 截图中文字符串带省略号