相关文章:
《项目解耦必备-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); }
效果如下图:
我们来用一张图总结一下整体的思路:思路很简单易懂,一个线程发送请求,bean对象接收到信息后直接发送到注册过的线程中进行UI更新,相信大家都能看明白吧。