Programming/Android
Kotlin 사용 (1) - singleton (Rx EventBus용)
ND Paul Kim
2017. 5. 26. 18:15
Otto나 GreenRobot같은 라이브러리를 이용할 수도 있지만,
Rx로도 충분히 구현이 가능하기 때문에(Otto는 Rx가 나오고 중단된 걸로 알고있음)
기존 자바 클래스
public class PerformanceEventBus {
public static final PerformanceEventBus instance = new PerformanceEventBus();
private BehaviorSubject<Long> performanceIdSubject = BehaviorSubject.create();
public PerformanceEventBus(){
}
public static PerformanceEventBus getInstance() {
return instance;
}
public void setPerformanceId(long performanceId){
performanceIdSubject.onNext(performanceId);
}
public Observable<Long> getPerformanceId(){
return performanceIdSubject;
}
}
코틀린 클래스
object TeamEventBus {
private var teamIdSubject: BehaviorSubject<Long> = BehaviorSubject.create()
fun setTeamId(teamId: Long){
teamIdSubject.onNext(teamId)
}
fun getTeamId(): Observable<Long>{
return teamIdSubject
}
}
싱글톤으로 사용할 경우 클래스가 아닌 object로 하고, 굳이 생성자는 필요x
teamId를 set할 때
TeamEventBus.INSTANCE.setTeamId(0L);
teamId를 get할 때(Rx)
TeamEventBus.INSTANCE.getTeamId()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.unsubscribeOn(Schedulers.io())
.subscribe(teamId -> {
this.teamId = teamId;
BPTeam team = BPTeam.findTeamWhereTeamId(this.teamId);
/** Realm 팀 정보가 있는 경우 (업데이트) */
if (team != null) {
if (teamNameEditText != null)
teamNameEditText.setText(team.getName());
if (descriptionEditText != null)
descriptionEditText.setText(team.getDescription());
if (agreeCheckBox != null)
agreeCheckBox.setChecked(team.isUsesMr());
isUpdate = true;
}
}, e -> {
Logger.d(Error.getThrowable(e));
Logger.d(BPApplication.getCrashDeviceInfo());
});
아마 자바로 했으면 TeamEventBus.getInstance().getTeamId() 이런식으로 진행될 것