Android之EventBus1.0 和EventBus3.0的使用详解

当Android项目越来越庞大的时候,应用的各个部件之间的通信变得越来越复杂,那么我们通常采用的就是Android中的解耦组件EventBus。EventBus是一款针对Android优化的发布/订阅事件总线。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息.优点是开销小,代码更优雅。以及将发送者和接收者解耦。

EventBus文档:http://greenrobot.org/eventbus/documentation

EventBus源码: https://github.com/greenrobot/EventBus.git

EventBus框架中涉及四个成分

订阅者,发布者,订阅事件,事件总线 它们的关系可以用官方的图表示:

Android之EventBus1.0 和EventBus3.0的使用详解

EventBus1.0

首先你要为你的app添加依赖库:

compile 'org.simple:androideventbus:1.0.5.1'

Activity中使用有三部:

1.注册(onCreate方法下)

EventBus.getDefault().register(this);

2.监听(自定义方法即可)

@Subscriber(tag = Utils.RESULTDATA)
public void resultData(String title)
{
  username.setText(title);
}


3.解除注册(onDestroy方法下)

EventBus.getDefault().unregister(this);


然后就是发布事件让监听事件接受通信信息,在更新UI操作,相关代码如下:

Activity

/****
 * eventbus通信
 * 1.0版本
 */
public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    EditText username;
    EditText password;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.setTitle("登录界面");
        setContentView(R.layout.activity_main);
        EventBus.getDefault().register(this);
        initView();
    }
    private void initView()
    {
        username=(EditText)findViewById(R.id.username);
        password=(EditText)findViewById(R.id.password);
        findViewById(R.id.login).setOnClickListener(this);
        findViewById(R.id.register).setOnClickListener(this);

    }

    /***
     * (String)->这里可以是任意类型--(在返回的时候对应就行)
     * @param title
     */
    @Subscriber(tag = Utils.RESULTDATA)
    public void resultData(String title)
    {
        username.setText(title);
    }
    //退出
    @Subscriber(tag=Utils.EXIT)
    public void exit(boolean isFang)
    {
        if (isFang) {
            finish();
        }
    }
    @Override
    public void onClick(View v) {
        String name=username.getText().toString();
        String pwd=password.getText().toString();
        switch (v.getId())
        {
            case R.id.login:
                break;
            case R.id.register:
                startActivity(new Intent(MainActivity.this,RegisterActivity.class));
                break;
        }
    }

    /***
     * 解除注册
     */
    @Override
    protected void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);
    }
}


通信的Activity

public class RegisterActivity extends AppCompatActivity implements View.OnClickListener{

    EditText username;
    LinearLayout linearLayout;
    Button register;
    Button exit;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        this.setTitle("注册界面");
        EventBus.getDefault().register(this);
        initView();
    }
    private void initView()
    {
        username=(EditText)findViewById(R.id.username);
        linearLayout=(LinearLayout)findViewById(R.id.linear);
        linearLayout.setVisibility(View.GONE);
        register=(Button) findViewById(R.id.login);
        register.setText("注册");
        register.setOnClickListener(this);
        exit=(Button)findViewById(R.id.register);
        exit.setText("退出");
        exit.setOnClickListener(this);

    }

    @Override
    public void onClick(View v) {
        switch (v.getId())
        {
            case R.id.login://注册
                String string=username.getText().toString();
                if (TextUtils.isEmpty(string))
                {
                    Toast.makeText(getApplicationContext(),"用户名不能为空",Toast.LENGTH_LONG).show();
                }
                else {
                    //发布事件
                    EventBus.getDefault().post(string,Utils.RESULTDATA);
                    finish();
                }
                break;
            case R.id.register://退出
                EventBus.getDefault().post(true,Utils.EXIT);
                finish();
                break;
        }
    }
    /***
     * 解除注册
     */
    @Override
    protected void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);
    }
}

效果如下图:(包含用户名和退出的通信)

Android之EventBus1.0 和EventBus3.0的使用详解

EventBus3.0

首先你要为你的app添加依赖库:

compile'org.greenrobot:eventbus:3.0.0'


注册和解除注册相同,监听事件有所改变

@Subscribe(threadMode = ThreadMode.MAIN)
 public void onUserName(User user)
 {
   username.setText(user.getUsername());
 }


threadMode的之有四个:

  1. NAIN UI主线程
  2. BACKGROUND 后台线程
  3. POSTING 和发布者处在同一个线程
  4. ASYNC 异步线程

也可以订阅事件的优先级,需加参数 ,如下:

/**
     * sticky。
     * 方式2
     */
    @Subscribe(sticky = true)
    public void onExit(User user)
    {
        username.setText(user.getUsername());
    }

EventBus3.0效果如下图:(包含用户名的两种通信方式)

Android之EventBus1.0 和EventBus3.0的使用详解

 

源码点击下载

相关推荐