보초의 코딩일기장

코틀린을 이용한 사진 관리 어플 만들기 (1) 본문

Android/Kotlin

코틀린을 이용한 사진 관리 어플 만들기 (1)

장보비 2020. 1. 7. 21:18
"코틀린 이것만 보면 돼" : 구현 코드 위주로 필기 & 주석

 

이 앱은

특정날짜 이후로 새로 촬영한 사진이 있는지 확인하기 위해 마지막 동기화 날짜를 서버로 수신한다.

 

해당 앱에는 자동 사진 동기화 기능과 선택 사진 동기화 기능이 있다.

자동 사진 동기화는 날짜 이름으로 폴더가 자동으로 생성되고, 선택 사진 동기화는 사용자가 직접 폴더를 만든다.

private lateinit var mWifiManager: WifiManager
...

private inner class WifistateThread : Thread(){ 
        override fun run(){
            val start = System.currentTimeMillis() 
            try{
                WifiStateHandler()?.sendEmptyMessage(0)
                //연결 시도중
                Thread.sleep(1500) //1.5초 대기
                while(true){ 
                    if(mWifiManager.connectionInfo.rssi > -70){
                        WifiStateHandler()?.sendEmptyMessage(1)
                        break //연결 완료
                    }else{
                        WifiStateHandler()?.sendEmptyMessage(0)
                        //연결 시도중
                    }

                    //10초
                    if(System.currentTimeMillis() - start >= 10000){
                        WifiStateHandler()?.sendEmptyMessage(2)
                        break //연결 실패
                    }
                    Thread.sleep(100)//0.1초
                }
            }catch (e: Exception){}
        }

 

Inner class: 내부 클래스. 외부 클래스의 객체에 대한 참조를 전달한다.

 

우선 와이파이 연결 유무를 판단할 것이다.

start는 현재의 시간을 넣는 변수로, 시간의 경과를 측정할 수 있도록 도와준다.

 

Thread.sleep(1500) 로 혹시 모를 사용자의 와이파이 연결을 위해 1.5초 대기 후 아래 코드가 실행된다.

connectionInfo.rssi 는 Wi-fi 신호의 세기를 알려주는데, -70 이상이라면 if문에 들어가 연결 완료코드를 만나게 된다.

그렇지 않으면 연결 중이라는 것이다.

연결 성공 = wifiStateHandler()?.sendEmptyMassage(1)

현재 연결 중 = wifiStateHandler()?.sendEmptyMassage(0)

 

그리고 10초의 시간이 경과하게 되면 연결이 실패하게 되는 로직이다.

 

internal inner class WifiStateHandler : Handler(){
            override fun handleMessage(msg: Message) {
                if(msg.what == 0){
                    ...
                } else if(msg.what==1){
                    ...
                } else{
                    ...
                }
            }
        }

 

여기서 WifistateHandler()는 메세지 객체가 인자로 들어가게 되는데,

이 때 연결 성공, 연결 중, 연결 실패인 0,1,2 로 판단하게 된다.

그리고 그 메세지에 따라 이벤트가 발생하는 것이다.


서버 레이아웃 구성하기

자바 GUI를 만들게 되며, Swing에서 제공하는 JFrame을 이용하여 창을 만든다.

class ServerLayout :JFrame(){
....
    init{
        title = "Picture Server"
        isVisible = true
        size = Dimension(655,365)
        layout=null
        defaultCloseOperation = WindowConstants.EXIT_ON_CLOSE

        val infoTab=JTabbedPane(SwingConstants.TOP) 
        infoTab.font = Font(null,Font.PLAIN,14)
        infoTab.setBounds(0,0,635,323)
        add(infoTab)

        val connectionState=JLabel("연결 상태 :")
        connectionState.font=Font(null, Font.PLAIN, 14)
        connectionState.setBounds(12,10,79,34)
        sendInfomation.add(connectionState)

....

 

Dimension : Window Size를 결정

dafaultCloseOperation = WindowConstants.EXIT_ON_CLOSE : 닫기 동작을 설정하는 기본 값

JTabbedPane : 탭 형식을 구현하기 위한 컴퍼넌트

font : 폰트 설정

setBounds : 절대위치와 크기를 설정 ( x, y, w, h )

add 를 이용하여 프레임에 올려준다.

  private fun setPcInfo(){
        try{
            val localMachine = java.net.InetAddress.getLocalHost()
            mPcName.text = localMachine.hostName
            mIpInfo.text = localMachine.hostAddress
        } catch (e:UnknownHostException){
            e.printStackTrace()
        }
    }

 

서버 PC이름과 IP주소를 가져오는 함수이다.

 

InetAddress는 자바에서 IP 주소를 표현할때 사용하는 클래스이다.

InetAddress.getLocalHost()는 실제 호스트 네임과 IP주소를 얻기 위해 DNS의 연결을 시도한다.

하지만 연결이 실패하면 루프백이 반환이 된다.

그렇게 해서 연결이 성공한다면 hostname과 host address 를 구한다.

 

Buy me a coffeeBuy me a coffee
Comments