很久没有写博客了,之前工作太忙了,好了,这次给大家带来Android开发中使用非常普遍,非常重要的开源框架EventBus(别名:事件总线);
这是一个github上面非常出名的开源项目,地址:点击打开链接查看EventBus
下面是官方介绍,这里我先截个图,然后详解:
上面这个图就介绍了eventBus的大概情况,我这里大致翻一下:
EventBus是对Android发布/订阅事件总线的优化。
这个图非常直观的告诉了我们EventBus的原理,其实就是发布者发送一个事件,这个事件通过事件总线找到对应的事件接受者,接受者接受到了事件后就能立即执行一些相应的操作(后面会给出一个详细使用的demo);
事件总线...
1、简化了组件之间的通信
1.1 将事件发布者和接受者解耦
1.2 在Activities, Fragments, and 后台线程之间执行的非常好(也非常好用)
1.3 避免了复杂的和容易出错的依赖性和生命周期问题
2、使你的代码简单(的确,非常简单,基本就一句话搞定)
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处于后台时,也能及时的更新界面上的显示数据。
然后注册了之后,就需要一个方法来接收事件总线上面的事件了,请注意,EventBus 3方法名可以选择自由(没有EventBus 2这样的命名约定)。方法名前面还必须要有@Subscribe注释才行,示例代码如下:
//当一个事件被发送出来时,这个方法将被调用(主要使用这个方法) @Subscribe public void onMessageEvent(MessageEvent event){ Toast.makeText(getActivity(), event.message, Toast.LENGTH_SHORT).show(); }
//当一个其他事件被发送出来出来时,这个方法将被调用(这个方法暂时还没有发现怎么用) @Subscribe public void handleSomethingElse(SomeOtherEvent event){ doSomethingWith(event); }
EventBus.getDefault().post(new MessageEvent("Hello everyone!"));
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; } }
<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图如下(成功了):
通过上面一个小小的测试,我们知道了怎样使用EventBus,但是有些人就会问了,我们项目中到底有什么好处呢?
使用场景是:当你要设置你的昵称或者头像时,这个时候你从设置界面回到个人中心界面时,比如个人中心要显示你的昵称和头像,这个时候,如果你使用生命周期的onRestart()方法或者onResume()方法来实时更新你的数据,但是这样就会使得你的app会出现卡顿之类的(实际开发经验),还有可能造成内存泄漏之类的。这个时候使用EventBus就非常方便,而且流程度非常好。还有人说了,使用接口不一样能够实现吗,但是EventBus为我们节省和很多代码,这不是很好吗。总之,强烈建议你在你的项目中使用它,因为它真的会使你开发非常方便。