* 在项目中,除了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...})。