* 在項目中,除了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即可完成數據庫表的創建。

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...})。