seops

[Callback] 1. SimpleCallback 본문

Android/Android

[Callback] 1. SimpleCallback

seops 2020. 10. 7. 23:55

하루 개발하고, 이틀 동안 테스트해서 배포하라고요?

 

어제 위에서 언급한 로직을 구상하느냐고, 블로그 글을 못썼다.

총 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
Comments