在BaseActivity增加EventBus让项目组件与后台线程间通信更便捷之实战篇
1.关于EventBus就是几个字概括:简化各组件间的通信
2.先添加依赖包。
implementation 'org.greenrobot:eventbus:3.0.0'
3.定义一个EventBusBaseActivity。注:为啥这样做呢?为了防止在工作中疏忽,关闭activity时未注销,产生问题。
/*** * 带有EventBusBaseActivity */ public abstract class EventBusBaseActivity extends Activity { @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(initLayout()); initView(); initData(); } //初始化EventBus,并注册EventBus public void initEventBus(boolean isOpen) { EventBus.getDefault().register(this); } //初始化加载布局 public abstract int initLayout(); //初始化布局View public abstract void initView(); //初始化数据及调用方法 public abstract void initData(); @Override protected void onDestroy() { super.onDestroy(); //解除EventBus注册 if(EventBus.getDefault().isRegistered(this)) { EventBus.getDefault().unregister(this); } } }
3.定义一个消息事件类。注以下界面及实操都参照鸟哥笔记来模仿的
/*** * 鸟哥笔记资料对象 */ public class NiaoGeBiJiInformationInfo { //昵称 private String name; //累计阅读数 private String readNum; //获得勋章数 private String medalNum; //可用羽毛数 private String featherNum; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getReadNum() { return readNum; } public void setReadNum(String readNum) { this.readNum = readNum; } public String getMedalNum() { return medalNum; } public void setMedalNum(String medalNum) { this.medalNum = medalNum; } public String getFeatherNum() { return featherNum; } public void setFeatherNum(String featherNum) { this.featherNum = featherNum; } }
4.需要处理事件的界面以下为列子。注:实操非Demo所以界面写的比较复杂,还望新手耐心阅读
我需要让界面修改昵称、累计阅读数、勋章数、可用羽毛数。
/** * 此Demo界面仿照乌哥笔记临摹 */ public class ImitateNiaoGeBiJiActivity extends EventBusBaseActivity implements View.OnClickListener { private ImageView avatarIv; private TextView nameTv; private TextView readNumIv; private TextView medalNumIv; private TextView featherNumIv; @Override public int initLayout() { return R.layout.activity_niaogebiji; } @Override public void initView() { avatarIv=findViewById(R.id.mine_avatar_iv); nameTv=findViewById(R.id.mine_name_tv); readNumIv=findViewById(R.id.mine_read_num_tv); medalNumIv=findViewById(R.id.mine_medal_num_tv); featherNumIv=findViewById(R.id.mine_feather_num_tv); } @Override public void initData() { //绑定点击事件 avatarIv.setOnClickListener(this); //注册EventBus initEventBus(true); } //需要更新的数据 @Subscribe(threadMode = ThreadMode.MAIN) public void updateInformation(NiaoGeBiJiInformationInfo info){ nameTv.setText(info.getName()); readNumIv.setText(info.getReadNum()); medalNumIv.setText(info.getMedalNum()); featherNumIv.setText(info.getFeatherNum()); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.mine_avatar_iv: //跳转至设置信息 activity Intent eventBusIntent=new Intent(this,SetInformationActivity.class); startActivity(eventBusIntent); break; } } }
5.以下为模拟修改用户资料的处理事件处理
/*** * 模拟设置信息功能模块 */ public class SetInformationActivity extends BaseActivity implements View.OnClickListener { private ImageView backIv; private TextView saveIv; private EditText nameEdt; private EditText redNumEdt; private EditText medalNumEdt; private EditText featherNumEdt; @Override public int initLayout() { return R.layout.activity_set_information; } @Override public void initView() { backIv= findViewById(R.id.set_information_back_iv); saveIv= findViewById(R.id.set_information_save_iv); nameEdt= findViewById(R.id.set_information_name_edt); redNumEdt= findViewById(R.id.set_information_red_num_edt); medalNumEdt= findViewById(R.id.set_information_medal_num_edt); featherNumEdt= findViewById(R.id.set_information_feather_num_edt); } @Override public void initData() { //绑定监听 backIv.setOnClickListener(this); saveIv.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.set_information_back_iv: finish(); break; case R.id.set_information_save_iv: //通过EventBus传输数据 NiaoGeBiJiInformationInfo info=new NiaoGeBiJiInformationInfo(); //设置昵称 info.setName(nameEdt.getText().toString().trim()); //设置阅读数 info.setReadNum(redNumEdt.getText().toString().trim()); //设置勋章数 info.setMedalNum(medalNumEdt.getText().toString().trim()); //设置羽毛数 info.setFeatherNum(featherNumEdt.getText().toString().trim()); EventBus.getDefault().post(info); finish(); break; } } }
6.以下为实际效果图仅供参考谢谢: