Zaif 공식 Android 앱이 미묘하기 때문에 Kotlin 공부를 겸하여 통화 쌍 Viewer 앱을 만들었습니다.

소개



어쩐지 컨디션을 무너뜨려 버려, 2018년 1월은 일을 쉬고 있었습니다.
가 슬슬 재활 겸 Kotlin의 공부를 하려고 생각해, Zaif의 가상 통화 페어 Viewer 어플리를 만들었습니다(제재를 Zaif로 한 것은 공식 어플이 엉망인데 k···게훈 게훈). 이런 녀석↓



왼쪽 목록 페이지는 10 초마다 (ZaifAPI는 요청 수에 제한이 있고, 일괄로 종가를 취득 할 수 없기 때문에 이런 사양에 orz)에 종가를 가져오고 있으며, 개별 페이지는 WebSocket에서 실시간 로 업데이트 중입니다. 이번은 Kotlin으로 만든 데다 Java와의 차이점, 망설일 것 같은 포인트를 정리해 보았습니다.

급한 분은 GitHub에 코드를 공개하고 있으므로 아래에서 부탁드립니다.
htps : // 기주 b. 코 m / 타루 m 즈 / 자이 fC

망설임 포인트 ① Java 시대에 신세를 졌던 ButterKnife가 필요 없다!



많은 분들이 신세를 졌을 것이다 ButterKnife입니다만, 필요 없습니다! !
라고 하는 것은 너무 말입니다만, 바인드 해 주지 않아도 Kotlin Android Extensions라고 하는 Kotlin 표준의 기능으로 직접 Layout의 요소를 취득할 수 있습니다. 이런 느낌.

activity_main.xml
/ 省略 /

    <android.support.v4.widget.SwipeRefreshLayout
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        android:id="@+id/swiperefresh"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        >

/ 省略 /

MainActivity.kt

import kotlinx.android.synthetic.main.activity_main.*

/ 省略 /

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // xmlで定義したIDで取ってこれる!
        swiperefresh.setOnRefreshListener({
            Timber.d("onRefresh called from SwipeRefreshLayout");
            initiateRefresh();
        });

/ 省略 /

다만, ViewHolder 등 특정의 변수에 붙이고 싶은 경우가 있거나, 이벤트의 바인드는 할 수 없다고 하는 불편함도 있는 것도 사실. 그렇다면 Kotlin 용 KotterKnife를 사용하는 것도 손입니다.
htps : // 기주 b. 코 m / 그럼 r 톤 / rok rk

갈망 포인트② WebSocket!



이것은 Kotlin 관련이 없습니다! w
완전히 자신의 경험 부족입니다. Kotlin을 공부하면서 Android 앱에서 WebSocket을 사용하는 방법도 조사했습니다. 실제로 해보니 Okhttp로 쉽게 구현할 수있었습니다! w

DetailActivity.kt
/ 省略 /
        private inner class EchoWebSocketListener : WebSocketListener() {

            override fun onOpen(webSocket: WebSocket, response: Response) {
                Timber.d("open")
            }

            override fun onMessage(webSocket: WebSocket?, text: String?) {
                Timber.d("Receiving : " + text!!)
                var currencyPairStream = mGson.fromJson(text, CurrencyPairStream::class.java)

                activity.runOnUiThread({
                    price.text = if (currencyPairStream.lastPrice != null) {
                        currencyPairStream.lastPrice!!.price.toString()
                    } else {
                        currencyPairStream.price.toString()
                    }
                })
            }

            override fun onMessage(webSocket: WebSocket, bytes: ByteString) {
                Timber.d("Receiving bytes : " + bytes.hex())
            }

            override fun onClosing(webSocket: WebSocket?, code: Int, reason: String?) {
                webSocket!!.close(1000, null)
                Timber.d("Closing : $code / $reason")
            }

            override fun onFailure(webSocket: WebSocket?, t: Throwable?, response: Response?) {
                Timber.d("Error : " + t?.message)
            }

        }
/ 省略 /

            val request: Request = Request.Builder().url(getString(R.string.api_ws_base_url, mCurrencyPair)).build()
            mWebSocket = mZaifClientWSOkHttpClient.newWebSocket(request, EchoWebSocketListener())

            // TODO: 調べた感じ不要な気がする。詳しい人教えて下さいm(_ _)m
            //mZaifClientWSOkHttpClient.dispatcher().executorService().shutdown()


갈망 포인트 3 Kotlin과 Java의 구문 차이



당연히 많은 분들이 주저하고 있어 위대한 선인님의 기사가 매우 참고가 되었습니다. 개인적으로 가장 당황한 것은 null의 취급입니까~. Java와 달리 Kotlin은 기본적으로 Null을 허용하지 않습니다. (?붙이거나?: 잡으면 Null도 취급할 수 있습니다만, 거기는 찬부양론 있는 곳…)
htps : // 코 m / 코헤르 / ms / b c58c01c6 f2 에세 658f

마지막으로



아직도 이 앱을 사용하기 쉽게 하고 싶다~라고 생각하고 있습니다. 사판, 매판 표시시키거나, 실제로 매매할 수 있도록 하거나. API의 형편상 차트는 어려울 것 같다.
열심히 할까요~.

좋은 웹페이지 즐겨찾기