EventBus3的使用(基于EventBus3.0事件总线,开发必备)
很久没有写博客了,之前工作太忙了,好了,这次给大家带来Android开发中使用非常普遍,非常重要的开源框架EventBus(别名:事件总线);
这是1个github上面非常出名的开源项目,地址:点击打开链接查看EventBus
下面是官方介绍,这里我先截个图,然后详解:
上面这个图就介绍了eventBus的大概情况,我这里大致翻1下:
EventBus是对Android发布/定阅事件总线的优化。
这个图非常直观的告知了我们EventBus的原理,其实就是发布者发送1个事件,这个事件通过事件总线找到对应的事件接受者,接受者接遭到了事件后就可以立即履行1些相应的操作(后面会给出1个详细使用的demo);
事件总线...
1、简化了组件之间的通讯
1.1 将事件发布者和接受者解耦
1.2 在Activities, Fragments, and 后台线程之间履行的非常好(也非常好用)
1.3 避免了复杂的和容易出错的依赖性和生命周期问题
2、使你的代码简单(的确,非常简单,基本就1句话弄定)
3、运行得非常快(确切)
4、非常小(jar包最多50k)
5、在app中已被使用了上亿次(这么多人在使用,你还没有用,就out了...)
6、具有先进的功能,如交付线程,用户优先级等。
好了,上面简单介绍了EventBus,那末接下来就教大家怎样使用了
豫备工作:在你的项目中的app那个Gradle中最后面的dependencies中添加EventBus,以下:
compile 'org.greenrobot:eventbus:3.0.0'
只需要 3 步就可以完成使用:
1、定义事件:
/**
* 定义事件
*/
public class MessageEvent {
public final String message;
public MessageEvent(String message){
this.message = message;
}
}
2、准备事件接受者(需要处理事件的方法)
事件接收者,Android, Activities and Fragments需要在他们的生命周期中进行注册和注销事件,只有注册了才能收到事件。范例代码以下:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//注册事件
EventBus.getDefault().register(this);
}
@Override
protected void onDestroy() {
//注销事件
EventBus.getDefault().unregister(this);
super.onDestroy();
}
这样当这个activity处于后台时,也能及时的更新界面上的显示数据。
然后注册了以后,就需要1个方法来接收事件总线上面的事件了,请注意,EventBus 3方法名可以选择自由(没有EventBus 2这样的命名约定)。方法名前面还必须要有@Subscribe注释才行,示例代码以下:
//当1个事件被发送出来时,这个方法将被调用(主要使用这个方法)
@Subscribe
public void onMessageEvent(MessageEvent event){
Toast.makeText(getActivity(), event.message, Toast.LENGTH_SHORT).show();
}
//当1个其他事件被发送出来出来时,这个方法将被调用(这个方法暂时还没有发现怎样用)
@Subscribe
public void handleSomethingElse(SomeOtherEvent event){
doSomethingWith(event);
}
3、在其他activity、fragment或后台线程发送事件,所有当前注册过接受者匹配事件的类型,将被接遭到,发送事件的代码以下:
EventBus.getDefault().post(new MessageEvent("Hello everyone!"));
好了,到这里,就把EventBus3.0的基本使用方法介绍完了,那末有人可能有疑问了:怎样没有1个demo呢,不试1下怎样有说服力呢?
好,接下来我就使用1个demo来介绍EventBus的使用方法;
1、首先,我使用2个activity来演示EventBus,FirstActivity是事件接收者,SecondActivity是事件的发送者;
定义的事件以下:
package com.chengguo.eventbus;
/**
* 定义事件
* Created by seven on 2016/5/29.
*/
public class MessageEvent {
public final String message;
public MessageEvent(String message){
this.message = message;
}
}
2、给FirstActivity注册事件总线,并处理事件,这里就是,当有匹配的事件时,显示Toast 并将消息更新到TextView中。
<pre class="java" name="code">package com.chengguo.eventbus;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
public class FirstActivity extends AppCompatActivity {
private TextView mMessageText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//注册事件
EventBus.getDefault().register(this);
setContentView(R.layout.first_activity);
mMessageText = (TextView) findViewById(R.id.text_message);
findViewById(R.id.btn_next).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(FirstActivity.this,SecondActivity.class));
}
});
}
/**
* 事件接受方法
* @param event
*/
@Subscribe
public void onMessageEvent(MessageEvent event){
Toast.makeText(FirstActivity.this, event.message, Toast.LENGTH_SHORT).show();
mMessageText.setText(event.message);
}
@Override
protected void onDestroy() {
//注销事件
EventBus.getDefault().unregister(this);
super.onDestroy();
}
}
3、SecondActivity发送消息,测试FirstActivity处于后台时,是不是能够接遭到消息,并处理数据。
package com.chengguo.eventbus;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import org.greenrobot.eventbus.EventBus;
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second_activity);
findViewById(R.id.btn_next).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EventBus.getDefault().post(new MessageEvent("您好!成功了!"));
}
});
}
}
测试的gif图以下(成功了):
通过上面1个小小的测试,我们知道了怎样使用EventBus,但是有些人就会问了,我们项目中到底有甚么好处呢?
使用处景是:当你要设置你的昵称或头像时,这个时候你从设置界面回到个人中心界面时,比如个人中心要显示你的昵称和头像,这个时候,如果你使用生命周期的onRestart()方法或onResume()方法来实时更新你的数据,但是这样就会使得你的app会出现卡顿之类的(实际开发经验),还有可能造成内存泄漏之类的。这个时候使用EventBus就非常方便,而且流程度非常好。还有人说了,使用接口不1样能够实现吗,但是EventBus为我们节省和很多代码,这不是很好吗。总之,强烈建议你在你的项目中使用它,由于它真的会使你开发非常方便。