EventBus3.0的使用
2016-03-22 08:26
337 查看
EventBus是Android的发布/订阅事件总线优化。主要功能是替代在Android四大组件Activity,Service,Intent,Handler,BroadCast线程之间传递消息,优点是开销小,代码更优雅。以及将发送者和接收者解耦。
public SimpleEventType(){}
}
public void onEvent(SimpleEventType event) {}
EventBus的执行顺序就是这样的。
下面是一个EventBus使用的简单例子:
描述:点击一个Button跳转界面。第二个页面的button点击后向第一个界面发送消息,第一个界面更新text值。
案例的代码:
package com.lidong.demo.eventbus.event;
`
`
`
就这两个重要的类,就已经实现了界面之间的通信。
public class SimpleEvent1 {
也就是这样,要说明的问题是消息接收的参数是由事件的实例来决定的。
代码地址
1.EventBus3.0的特点:
(1)简化了组件之间的通信(2)将事件发送方和接收方执行与Activities, Fragments和后台线程,避免了复杂的和容易出错的依赖性和生命周期问题(3)包的体积很小(~ 50 k jar),(4)、拥有先进的功能,如交付线程,用户优先级等。2.EventBus3.0的下载地址:
https://github.com/greenrobot/EventBus3.EventBus3.0的基本使用
在EventBus中,获取实例的方法一般是采用EventBus.getDefault()来获取默认的EventBus实例。EventBus mEventBus = Event.getDefault();
(3.1)自定义一个类,可以是空类,比如:
public class SimpleEventType {public SimpleEventType(){}
}
(3.2)在要接收消息的页面注册:
mEventBus.register(this);(3.3)发送消息
mEventBus.post(new SimpleEventType event);(3.4)接受消息的页面实现(共有四个枚举类型注解,各功能不同,这是其中之一,可以选择性的实现,这里先实现一个在主线程的):
@Subscribe(threadMode = ThreadMode.MAIN)//在主线程public void onEvent(SimpleEventType event) {}
(3.5)解除注册
mEventBus.unregister(this);EventBus的执行顺序就是这样的。
下面是一个EventBus使用的简单例子:
描述:点击一个Button跳转界面。第二个页面的button点击后向第一个界面发送消息,第一个界面更新text值。
案例的代码:
package com.lidong.demo.eventbus.event;
/** * Created by lidong on 2016/3/21. */ public class SimpleEvent { private String mMsg; public SimpleEvent(String msg) { mMsg = msg; } public String getMsg(){ return mMsg; } } `package com.lidong.demo.eventbus; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; import com.lidong.demo.R; import com.lidong.demo.eventbus.event.SimpleEvent; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import butterknife.Bind; import butterknife.ButterKnife; import butterknife.OnClick; public class EventBusDemo1Activity extends AppCompatActivity { @Bind(R.id.toolbar) Toolbar toolbar; @Bind(R.id.btn_open_page1) Button btnOpenPage1; @Bind(R.id.tv_display) TextView tvDisplay; private String TAG = EventBusDemo1Activity.class.getSimpleName(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_event_bus_demo1); ButterKnife.bind(this); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); ButterKnife.bind(this); //注册EventBus EventBus.getDefault().register(this); } @OnClick({R.id.btn_open_page1}) public void onClick(View v){ switch (v.getId()){ case R.id.btn_open_page1: startActivity(new Intent(EventBusDemo1Activity.this,EventBusDemo2Activity.class)); break; } } @Subscribe() public void onEventMainThread(SimpleEvent event) { String msg = "onEventMainThread收到了消息:" + event.getMsg(); Log.d(TAG, msg); tvDisplay.setText(msg); Toast.makeText(this, msg, Toast.LENGTH_LONG).show(); } @Override protected void onDestroy(){ super.onDestroy(); EventBus.getDefault().unregister(this);//解除EventBus } }
`
`
package com.lidong.demo.eventbus; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.view.View; import android.widget.Button; import com.lidong.demo.R; import com.lidong.demo.eventbus.event.SimpleEvent; import org.greenrobot.eventbus.EventBus; import butterknife.Bind; import butterknife.ButterKnife; import butterknife.OnClick; public class EventBusDemo2Activity extends AppCompatActivity { @Bind(R.id.toolbar) Toolbar toolbar; @Bind(R.id.btn_click_send_message) Button btnClickSendMessage; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_event_bus_demo2); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); ButterKnife.bind(this); } @OnClick({R.id.btn_click_send_message}) public void onClick(View v){ switch (v.getId()){ case R.id.btn_click_send_message: EventBus.getDefault().post( new SimpleEvent("你好,EventBus!")); break; } } }
`
就这两个重要的类,就已经实现了界面之间的通信。
EventBus的消息发送
` EventBus.getDefault().post( new SimpleEvent("你好,EventBus!"));`
EventBus的消息接收
在EventBus中使用中,假如有三个事件发送到一个页面,如何接收呢?则是通过事件的实例来区别的。public class SimpleEvent1 {
private String mMsg; public SimpleEvent1(String msg) { mMsg = msg; } public String getMsg(){ return mMsg; } } public class SimpleEvent2 { private String mMsg; public SimpleEvent2(String msg) { mMsg = msg; } public String getMsg(){ return mMsg; } } public class SimpleEvent3 { private String mMsg; public SimpleEvent3(String msg) { mMsg = msg; } public String getMsg(){ return mMsg; } } EventBus.getDefault().post( new SimpleEvent1("你好,EventBus1!"));break; EventBus.getDefault().post( new SimpleEvent2("你好,EventBus2!"));break; EventBus.getDefault().post( new SimpleEvent3("你好,EventBus3!"));break;
四种不同优先级的事件处理(注解)
@Subscribe(threadMode = ThreadMode.MAIN)//在主线程 public void onEventUse(SimpleEvent event) { Log.d(TAG, "onEventMainThread收到了消息:" + event.getMsg()); } @Subscribe(threadMode = ThreadMode.MAIN)//在主线程 public void onEventUse(SimpleEvent2 event) { Log.d(TAG, "onEventMainThread收到了消息:" + event.getMsg()); } @Subscribe(threadMode = ThreadMode.BACKGROUND)//在后台线程 public void onEventUse(SimpleEvent3 event){ Log.d(TAG, "onEventBackground收到了消息:" + event.getMsg()); } @Subscribe(threadMode = ThreadMode.ASYNC)//强制在后台线程执行 public void onEventUseAsync(SimpleEvent2 event){ Log.d(TAG, "onEventAsync收到了消息:" + event.getMsg()); } @Subscribe(threadMode = ThreadMode.POSTING)//默认方式, 在发送线程执行 public void onEventUser(SimpleEvent3 event) { Log.d(TAG, "OnEvent收到了消息:" + event.getMsg()); }
也就是这样,要说明的问题是消息接收的参数是由事件的实例来决定的。
代码地址
相关文章推荐
- Android Https相关完全解析 当OkHttp遇到Https
- html 基础代码
- Java数据库——处理大数据对象
- 编程实现通过状态图确定句子
- Android图片海报制作-自定义文字排版控件组件
- Mac常见问题解决
- http://blog.csdn.net/olanlanxiari/article/details/8104505
- 被遗忘的R中的sql语句
- 插入排序
- android自定义控件库
- java基础之集合List-ArrayList、LinkedList、Vector的差别
- 选择排序
- 使用React并做一个简单的to-do-list
- 搭建IM服务 so easy
- SOAPUI 接口测试学习笔记节选 结果写入操作方法介绍
- C++ 进阶——object slicing 与虚函数与dynamic_cast<>
- MySQL排序原理与案例分析
- UGUI UI操作事件
- PHP学习笔记-PHP语言基础1
- Spring Aop实例