일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- 재태크
- 목표한번이뤄보자
- FrameLayout
- Android Universal Image Loader
- 운동
- 2020년 목표
- 독서
- TabLayout and ViewPager
- overridePendingTraction
- BottomNavigationViewEx
- 개발
- FragmentPagerAdapter
- FragmentSatePagerAdapter
- Today
- Total
seops
[Callback] 1. SimpleCallback 본문
하루 개발하고, 이틀 동안 테스트해서 배포하라고요?
어제 위에서 언급한 로직을 구상하느냐고, 블로그 글을 못썼다.
총 3개의 환경 변화에 따라, 타이머를 Start / Stop / Refresh 하는 기능이 필요했다.
다행히도 어제 아이패드로 그려봤던 구상대로 오늘 개발을 완료했지만, 역시나... 예외 시나리오가 많아, 많은 테스트가 필요할 것 같다.
아무튼 오늘은 어제 개발했던 프로젝트의 Kotlin 버전을 만들어볼 계획이다.
간략한 구상은 아래와 같다.
1. BluetoothStatus - Connect / Disconnect
2. EngineStatus - Engine On / Engine Off
3. Communication - Trigger
(* Communication의 경우, 하드웨어 모듈과 앱 간의 통신을 의미)
먼저, 코틀린 콜백을 알아보자.
기존에 자바 프로젝트에서 사용했던 방법도 있지만 (interface를 활용한 방법)
이번 기아자동차 러시아 프로젝트를 하면서, 새로운 방법을 본 것 같다.
stack overflow를 보니, lamda를 활용한 방법이라는 것을 확인했다.
lamda를 활용하면, 아래와 같이 표현이 가능하다.
(참조 : stackoverflow.com/questions/47499891/how-i-can-use-callback-in-kotlin)
// CircleShape.kt
var listener: (()->Unit)? = null
// MainActivity.kt
mCircleShape.listenr = {
~
}
(참고하면 좋을 글인 것 같다. medium.com/@ccamdi/kotlin으로-작성한-interface를-lambda로-표현해보자-385425e0e954)
이제 빡! 코딩 시작
실제로 콜백을 올려주는 환경을 만들기까지는 못했으나, BluetoothEvent / CommEvent / EngineEvent, 싱글톤으로 구성한 클래스에서 send@@ 메서드를 통해 상태를 공유하면 MainActivity에서 정의한 콜백으로 데이터가 가도록 구성을 해봤다.
[ Event Class ]
// BluetoothEvent
class BluetoothEvent private constructor() {
private object HOLDER {
val INSTANCE = BluetoothEvent()
}
companion object {
val instance = HOLDER.INSTANCE
}
public fun sendBluetoothEvent(bluetoothStatus: BluetoothStatus) {
onBluetoothEvent?.invoke(bluetoothStatus)
}
var onBluetoothEvent: ((BluetoothStatus) -> Unit)? = null
}
// CommEvent
class CommEvent private constructor() {
private object HOLDER {
val INSTANCE = CommEvent()
}
companion object {
val instance: CommEvent by lazy {
HOLDER.INSTANCE
}
}
public fun sendCommEvent() {
onCommEventCallback?.invoke()
}
var onCommEventCallback: (() -> Unit)? = null
}
// EngineEvent
class EngineEvent private constructor() {
private object HOLDER {
val INSTANCE = EngineEvent()
}
companion object {
val instance: EngineEvent by lazy {
HOLDER.INSTANCE
}
}
public fun sendEngineEvent(engineStatus: EngineStatus) {
onEngineEventCallback?.invoke(engineStatus)
}
var onEngineEventCallback: ((EngineStatus) -> Unit)? = null
}
[ MainActivity ]
class MainActivity : AppCompatActivity() {
private var bluetoothEvent: BluetoothEvent? = null
private var commEvent: CommEvent? = null
private var engineEvent: EngineEvent? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding: ActivityMainBinding = DataBindingUtil.setContentView(this@MainActivity, R.layout.activity_main)
with(binding) {
setLayout(this)
subscribeUI()
setCallback()
}
}
private fun setLayout(binding: ActivityMainBinding) {
}
private fun subscribeUI() {
}
private fun setCallback() {
bluetoothEvent = BluetoothEvent.instance.apply {
onBluetoothEvent = {
}
}
commEvent = CommEvent.instance.apply {
onCommEventCallback = {
}
}
engineEvent = EngineEvent.instance.apply {
onEngineEventCallback = {
}
}
}
}
내일은 버튼을 이용해서, 서로 interaction 할 수 있도록 추가해봐야겠다.
'Android > Android' 카테고리의 다른 글
[RecyclerView] 1. RecyclerView and DiffUtil (0) | 2020.10.20 |
---|---|
[Callback] 2. Singleton Class (0) | 2020.10.12 |
[Firebase] 3. SimplePush (0) | 2020.10.04 |
[Firebase] 2. Push Notification 로직 구상 (0) | 2020.09.22 |
[Firebase] 1. Push Notification 연동 (0) | 2020.09.21 |