EventBus的使用(基于EventBus3.0,开发必备)

EventBus3的使用(基于EventBus3.0事件总线,开发必备)

              很久没有写博客了,之前工作太忙了,好了,这次给大家带来Android开发中使用非常普遍,非常重要的开源框架EventBus(别名:事件总线);

这是一个github上面非常出名的开源项目,地址:点击打开链接查看EventBus

            下面是官方介绍,这里我先截个图,然后详解:

             EventBus的使用(基于EventBus3.0,开发必备)_第1张图片

上面这个图就介绍了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);
}
       3、在其他activity、fragment或者后台线程发送事件,所有当前注册过接受者匹配事件的类型,将被接受到,发送事件的代码如下:
EventBus.getDefault().post(new MessageEvent("Hello everyone!"));
        
        好了,到这里,就把EventBus3.0的基本使用方法介绍完了,那么有人可能有疑问了:怎么没有一个demo呢,不试一下怎么有说服力呢?
 好,接下来我就使用一个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图如下(成功了):


       通过上面一个小小的测试,我们知道了怎样使用EventBus,但是有些人就会问了,我们项目中到底有什么好处呢?

使用场景是:当你要设置你的昵称或者头像时,这个时候你从设置界面回到个人中心界面时,比如个人中心要显示你的昵称和头像,这个时候,如果你使用生命周期的onRestart()方法或者onResume()方法来实时更新你的数据,但是这样就会使得你的app会出现卡顿之类的(实际开发经验),还有可能造成内存泄漏之类的。这个时候使用EventBus就非常方便,而且流程度非常好。还有人说了,使用接口不一样能够实现吗,但是EventBus为我们节省和很多代码,这不是很好吗。总之,强烈建议你在你的项目中使用它,因为它真的会使你开发非常方便。




你可能感兴趣的:(android,Android开发,EventBus,EventBus3.0)