EventBus使用详细讲解,结合示例

  1. 前言

EventBus是一款针对Android优化的发布/订阅事件总线。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息.优点是开销小,代码更优雅。以及将发送者和接收者解耦。

2.使用步骤

(1)在要接收消息的页面注册,比如activity的onCreate()方法里面加入下面方法:

EventBus.getDefault().register(this);

(2)退出接收页面的时候解绑,比如在activity的onDestory()方法里面加入下面方法:

EventBus.getDefault().unregister(this);

(3)发送消息,post方法里面是一个object,可以传任何对象,我这边用的是枚举,你当然也可以用自定义对象,字符串,都可以。

EventBus.getDefault().post(Event.IMAGE_LOADER_SUCCESS);
public enum Event {
    /**
     * 图片成功
     */
    IMAGE_LOADER_SUCCESS,

}

4)在接受消息的页面实现此方法(共有四个函数)

 @Override
    public void onEventMainThread(Event event) {
        super.onEventMainThread(event);
        switch (event){
            case IMAGE_LOADER_SUCCESS:
                clearEditContent();
                break;
        }
    }

接收页面是如何接收到通知的呢?接收页面的Event的值跟EventBus.getDefault().post(Event.IMAGE_LOADER_SUCCESS);的发送的值相同,则此页面就接收到通知,如果多个页面都有同一个event,则这几个页面都可以收到通知。

3.细节讲解

(1)EventBus还有另外有个不同的函数,他们分别是:

1、onEvent
2、onEventMainThread
3、onEventBackgroundThread
4、onEventAsync

onEvent:如果使用onEvent作为订阅函数,那么该事件在哪个线程发布出来的,onEvent就会在这个线程中运行,也就是说发布事件和接收事件线程在同一个线程。

onEventMainThread:如果使用onEventMainThread作为订阅函数,那么不论事件是在哪个线程中发布出来的,onEventMainThread都会在UI线程中执行,接收事件就会在UI线程中运行,这个在Android中是非常有用的,因为在Android中只能在UI线程中跟新UI,所以在onEvnetMainThread方法中是不能执行耗时操作的。

onEventBackground:如果使用onEventBackgrond作为订阅函数,那么如果事件是在UI线程中发布出来的,那么onEventBackground就会在子线程中运行,如果事件本来就是子线程中发布出来的,那么onEventBackground函数直接在该子线程中执行。

onEventAsync:使用这个函数作为订阅函数,那么无论事件在哪个线程发布,都会创建新的子线程在执行onEventAsync.

4.项目实战:

界面如下所示:
EventBus使用详细讲解,结合示例_第1张图片---->EventBus使用详细讲解,结合示例_第2张图片------->EventBus使用详细讲解,结合示例_第3张图片
然后在第三个界面,点击【发送通知】按钮,通知前两个界面。

基础类代码如下:

package com.test.eventbus;

import android.app.Activity;
import android.os.Bundle;

import de.greenrobot.event.EventBus;

/**
 * <功能详细描述>
 *
 * @author caoyinfei
 * @version [版本号, 2016/6/15]
 * @see [相关类/方法]
 * @since [产品/模块版本]
 */
public class BaseActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        EventBus.getDefault().register(this);
        super.onCreate(savedInstanceState);
    }

    @Override
    protected void onDestroy() {
        EventBus.getDefault().unregister(this);
        super.onDestroy();
    }

    public void onEventMainThread(Event event) {

    }
}

三个页面代码如下所示:

package com.test.eventbus;

import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class MainActivity extends BaseActivity {

    private Button next;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        next = (Button) findViewById(R.id.next);
        next.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this,SecondActivity.class);
                startActivity(intent);
            }
        });
    }

    @Override
    public void onEventMainThread(Event event) {
        super.onEventMainThread(event);
        switch (event){
            case IMAGE_LOADER_SUCCESS:
                Log.i("cyf","MainActivity");
                break;
        }
    }
}

package com.test.eventbus;

import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class SecondActivity extends BaseActivity {
    private Button next;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        next = (Button) findViewById(R.id.next);
        next.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(SecondActivity.this, ThirdActivity.class);
                startActivity(intent);
            }
        });
    }

    @Override
    public void onEventMainThread(Event event) {
        super.onEventMainThread(event);
        switch (event){
            case IMAGE_LOADER_SUCCESS:
                Log.i("cyf", "SecondActivity");
                break;
        }
    }
}

package com.test.eventbus;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import de.greenrobot.event.EventBus;

public class ThirdActivity extends BaseActivity {

    private Button send;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_third);

        send = (Button) findViewById(R.id.send);
        send.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                EventBus.getDefault().post(Event.IMAGE_LOADER_SUCCESS);
            }
        });
    }
}

运行结果如下所示:

06-15 13:51:15.891 15665-15665/com.test.eventbus I/cyf: MainActivity
06-15 13:51:15.891 15665-15665/com.test.eventbus I/cyf: SecondActivity

接收页面的Event的值跟EventBus.getDefault().post(Event.IMAGE_LOADER_SUCCESS);的发送的值相同,则此页面就接收到通知,如果多个页面都有同一个event,则这几个页面都可以收到通知。------------验证了确实是这样的。

项目地址:http://download.csdn.net/detail/dfskhgalshgkajghljgh/9550157


欢迎一起交流讨论
群号:469890293


关注我的公众号,更多优质文章将通过公众号推送。
微信扫一扫下方二维码即可关注:
EventBus使用详细讲解,结合示例_第4张图片

你可能感兴趣的:(android架构相关)