阅读更多

当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框架中涉及四个成分

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

 

 

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);    }}

 

 

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

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效果如下图:(包含用户名的两种通信方式)

 

 

 

源码点击下载

 

 

更多相关文章

  1. Android中微信抢红包插件原理解析和开发实现
  2. Android编程学习笔记 之 基于回调的事件传播
  3. Android(安卓)线程模型和 AsyncTask
  4. Android线程间通信-Handler消息机制
  5. Android(安卓)消息机制(Handler Looper Message )理解
  6. Android信息推送—AndroidPN的学习(上)
  7. android写一个Rxjava
  8. android线程、UI、AsyncTask
  9. Android中MotionEvent的来源和ViewRootImpl

随机推荐

  1. SearchView 自动展开和弹出输入法
  2. add 'tools:replace="android:value"' to
  3. Android Apkshare
  4. android new feature on 4.2
  5. Android Studio JDK版本问题报错
  6. 【Android深入解析】Manifest配置文件解
  7. android 颜色(color)
  8. Android与PHP服务器交互
  9. Android文件合并时,打包出错
  10. android 程序崩溃后重启