🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
* 在项目中,除了EventBus,还有RxJava、GreenDao和ButterKnife这3个库被频繁使用。 ### RxJava * * * * * * 在项目中,IflySynthesizer、LingjuAudioPlayer均使用了RxJava对业务方法进行了封装,而对于网络请求、加载数据库数据等耗时操作同样使用了RxJava进行子/主线程的线程切换。 以加载闹钟记录为例: ~~~ private void loadData() { Flowable.create(new FlowableOnSubscribe<Object>() { @Override public void subscribe(FlowableEmitter<Object> e) throws Exception { reset(); //TODO io线程加载数据库数据 ... e.onNext(0); } }, BackpressureStrategy.BUFFER) .subscribeOn(Schedulers.io()) //执行订阅(subscribe())所在线程 .doOnSubscribe(new Consumer<Subscription>() { @Override public void accept(Subscription subscription) throws Exception { //显示加载进度条 mCpbLoad.setVisibility(View.VISIBLE); } }) .subscribeOn(AndroidSchedulers.mainThread()) .observeOn(AndroidSchedulers.mainThread()) //响应订阅(Sbscriber)所在线程 .subscribe(new Consumer<Object>() { @Override public void accept(Object o) throws Exception { /* 回到主线程,隐藏进度条,刷新列表 */ mCpbLoad.setVisibility(View.GONE); mAdapter.notifyDataSetChanged(); } }); } ~~~ ### GreenDao * * * * * * GreenDao是一个简化SQLite数据库创建和维护的轻量级的库。完成初始化配置之后只需要通过注解即可建表,通过该库提供的增删该查方法即可一句话操作数据库。 * 项目中创建的记录实体类放在`com.lingju.model`包下,而对应的数据操作对象则放在`com.lingju.model.dao`包下。 以闹钟记录为例: 1. 新建一个实体类使用@entity设置表名和@Id设置主键ID ~~~ @Entity(nameInDb = "t_alarm") public class AlarmClock { @Id(autoincrement = true) private Long id; private int rtime; private int frequency; private int valid; private String ring; private String path; private Date created; private String item; //闹钟类型 private boolean repeat; //是否重复 private Date rdate; //以下与服务器同步标记 private String sid; //服务器记录id,该记录的唯一标示 private long timestamp; //时间戳,记录的时效性标记 private int recyle; //0:有效, 1:回收 private boolean synced = true; //false表示未同步,待更新 } ~~~ 2. 定义完该类并封装好属性后,Rebuild Project即可完成数据库表的创建。 ![](https://box.kancloud.cn/099b10a4cd872d17d0ff440db4b964b2_358x307.png) 3. 创建dao,封装数据访问方法 ~~~ //获取闹钟dao对象 mClockDao = DaoManager.get().getDaoSession().getAlarmClockDao(); /** * 插入一条闹钟记录 **/ public boolean insertAlarm(AlarmClock alarm) { if (alarm.getId() != null) alarm = findAlarmById(alarm.getId()); alarm.setRecyle(0); return mClockDao.insertOrReplace(alarm) > 0; } /** * 删除一条闹钟记录 **/ public void deleteAlarm(AlarmClock alarm) { alarm = findAlarmById(alarm.getId()); alarm.setRecyle(1); mClockDao.update(alarm); } /** * 修改一条闹钟记录 **/ public void updateAlarm(AlarmClock alarm) { AlarmClock realAlarm = findAlarmById(alarm.getId()); alarm.setTimestamp(realAlarm.getTimestamp()); alarm.setRecyle(0); mClockDao.update(alarm); } /** * 查询所有闹钟记录 **/ public List<AlarmClock> findAllAlarm() { return mClockDao.queryBuilder().where(AlarmClockDao.Properties.Recyle.eq(0)).list(); } ~~~ ### ButterKnife * * * * * * ButterKnife是专门为Android View设计的绑定注解,专业解决各种findViewById和setOnClickListener。建议与AS插件Android ButterKnife Zelezny配合使用,大大省略了上述两种问题的无意义的代码编写时间。 以MainActivity为例: ~~~ public class MainActivity extends BaseActivity implements IAdditionAssist.AssistView { @BindView(R.id.index_text_editext) EditText editText; @BindView(R.id.index_bottom_box) FrameLayout bottomBox; @BindView(R.id.index_body) FrameLayout body; @BindView(R.id.index_chat_list_box) FrameLayout bodyChatList; @BindView(R.id.main_content_box) FrameLayout mMainContentBox; @BindView(R.id.index_text_input_box) LinearLayout mIndexTextInputBox; @BindView(R.id.fl_guide) FrameLayout mFlGuide; ... @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //资源绑定 ButterKnife.bind(this); ... } //监听器绑定 @OnClick(R.id.index_text_send_bt) void sendMsg2Robot() { ... } } ~~~ 注意,在非Activity中使用绑定要使用`ButterKnife.bind(Object, View)`;多个点击监听绑定使用@OnClick({resId, resId, resId...})。