项目解耦必备-EventBus的详细讲解(一)

相关文章:

《项目解耦必备-EventBus的详细讲解(二)》


很早之前,就想写一篇关于EventBus使用的文章,一直没有时间,最近项目不太忙,抽出一些时间把之前的项目中的技术沉淀一下,抽取出一些东西写成文章与大家分享一下。

在做项目的时候,难免会碰到一个问题,就是在不同线程或者不同的组件中进行通信,Android提供了一个Intent可以实现这种功能,但是对于项目来说耦合性太高,所以出现了一个叫做EventBus的机制来处理这些问题。废话不多说,直接切入主题。

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

使用EventBus其实很简单,我们分为四步来详细讲解:

第一步:下载EventBus的jar包,可以去Git官网下载。

下载完成后,手动编译一下Gradle:compile files('libs/EventBus.jar')

注意:有很多朋友搭建之后会出现错误,这是因为我这个是基于3.0以下的版本,你一定要下载3.0以下的才可以正常运行,至于2.0和3.0以上的什么区别,后面我会继续推出讲解,主要就是3.0以上是全注解方式。

第二步:建立一个bean类,用于接收和传递数据,接受的类型为String字符串。

public class EventBusBean {
    private String message;
    public EventBusBean(String message) {
        this.message = message;
    }
    public String getMessage() {
        return message;
    }
}

第三步:编写MainActivity,在MainActivity中我们建立一个Button和一个TextView,点击Button后会跳转到SecondActivity

在加载完布局之后要对EventBus进行注册,并在Activity销毁的时候进行反注册。

public class MainActivity extends AppCompatActivity {
    @Bind(R.id.textView)
    TextView textView;
    @Bind(R.id.button)
    Button button;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        ButterKnife.bind(this);
        //注册EventBus
        EventBus.getDefault().register(this);
    }
    @OnClick({R.id.textView, R.id.button})
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.button:
                //跳转界面
                startActivity(new Intent(MainActivity.this, SecondActivity.class));
                break;
        }
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        //反注册EventBus
        EventBus.getDefault().unregister(this);
    }

第四步:编写SecondActivity,在SecondActivity中值创建一个Button用于发送数据。

 public class SecondActivity extends AppCompatActivity {
    @Bind(R.id.button)
    Button button;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second);
        ButterKnife.bind(this);
    }
    @OnClick(R.id.button)
    public void onClick() {
       //将需要把传递给MianActivity的数据post到我们建立的EventBusBean中,发送信息完成
        EventBus.getDefault().post(new EventBusBean("MainActivity的内容已经改变了!"));
    }
}

第五步:MainActivity执行回调,在MainActivity中我们实现一个方法onEventMainThread,我们先不管他是怎么回事,我在后面会详细讲解,在这个方法中我们将我们之前SecondActivity保存的数据拿出来进行UI的更新。

    @OnClick({R.id.textView, R.id.button})
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.button:
                //跳转界面
                startActivity(new Intent(MainActivity.this, SecondActivity.class));
                break;
        }
    }
    //EventBus发送消息之后回调的方法,参数是之前建立的Bean对象
    public void onEventMainThread(EventBusBean bean){
       //取出数据并进行UI的更新
        textView.setText(bean.getMessage());
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        //反注册EventBus
        EventBus.getDefault().unregister(this);
    }

效果如下图:

项目解耦必备-EventBus的详细讲解(一)_第1张图片

我们来用一张图总结一下整体的思路:思路很简单易懂,一个线程发送请求,bean对象接收到信息后直接发送到注册过的线程中进行UI更新,相信大家都能看明白吧。

项目解耦必备-EventBus的详细讲解(一)_第2张图片

你可能感兴趣的:(android,EventBus)