Coder Social home page Coder Social logo

onbid's Introduction

Merry-Go-Round


앱 개발 동기

공매 관련 앱 중에 건물이나 토지를 구매를 하는 경우, 주변 지형과 주변에 편의 시설등의 정보를 함께 설명해주는 앱이 없다는 생각에 공매 관련 정보와 더불어 관련 주변 정보들을 지도를 통해 나타내 줄 수 있는 앱이 있었으면 좋겠다는 생각에 해당 앱을 개발하게 되었습니다.


기능

  1. 앱 내에서 검색을 통한 공매물 관련 주요 정보들과 리스트 표시
  2. 해당 리스트 중 원하는 item을 선택해서 상세 정보 확인 가능
  3. 버튼을 통해 해당 공매 기관에 위치를 지도에서 확인 가능

사용 기술

  • Android Studio
  • Kotlin
  • Google Map Api
  • 이용기관공매물건조회서비스 Api

API 파싱

위에 코드를 통해 데이터를 파싱 받을 수 있습니다. 데이터를 파싱 받기 전에 받기 원하는 데이터를 받을 변수를 설정해주고 해당 데이터를 받을 수 있는 Data에 해당하는 데이터 data class를 만들어주면 됩니다.

 while (eventType != XmlPullParser.END_DOCUMENT) {

                when (eventType) {

                    XmlPullParser.START_TAG
                    -> {
                        tag = parser.name

                        if (tag == "item") {
                        } else if (tag == "PBCT_NO") {
                            parser.next()
                            pbct_no = parser.text
                        } else if (tag == "PLNM_NM") {
                            parser.next()
                            plnm_nm = parser.text
                        } else if (tag == "CTGR_FULL_NM") {
                            parser.next()
                            ctgr_full = parser.text
                        } else if (tag == "PBCT_BEGN_DTM") {
                            parser.next()
                            pbct_begn = parser.text
                            try {
                                std = stsdf.parse(pbct_begn)
                            }catch (e : Exception){
                                Log.v("Exception",e.localizedMessage)
                            }
                            stsdf.applyLocalizedPattern("yyyy년 MM월 dd일 hh:mm")
                            pbct_begn = stsdf.format(std)

                        } else if (tag == "PBCT_CLS_DTM") {
                            parser.next()
                            pbct_cls = parser.text
                            try {
                                endd = endsdf.parse(pbct_cls)
                            }catch (e:Exception){
                                Log.v("Exception",e.localizedMessage)
                            }
                            endsdf.applyLocalizedPattern("yyyy년 MM월 dd일 hh:mm")
                            pbct_cls = endsdf.format(endd)
                        } else if(tag == "PBCT_EXCT_DTM") {
                            parser.next()
                            pbct_exct_dtm = parser.text
                        } else if(tag == "PLNM_DT") {
                            parser.next()
                            plnm_dt = parser.text
                        }
                        else if(tag == "PLNM_NO") {
                            parser.next()
                            plnm_no = parser.text
                        } else if(tag == "PLNM_KIND_NM") {
                            parser.next()
                            plnm_kind_nm = parser.text
                        } else if(tag == "BID_DVSN_NM") {
                            parser.next()
                            bid_dvsn_nm = parser.text
                        } else if(tag == "ORG_NM") {
                            parser.next()
                            org_plnm_no = parser.text
                        } else if(tag == "BID_MTD_NM") {
                            parser.next()
                            bid_mtd_nm = parser.text
                        } else if(tag == "TOT_AMT_UNPC_DVSN_NM") {
                            parser.next()
                            tot_amt_unpc_dvsn_nm = parser.text
                        } else if(tag == "DPSL_MTD_NM") {
                            parser.next()
                            dpsl_mtd_nm = parser.text
                        } else if(tag == "PRPT_DVSN_NM") {
                            parser.next()
                            prpt_dvsn_nm = parser.text
                        }
                        else if (tag == "totalCount") {
                            if (btotal) {
                                parser.next()
                                val finalnum = parser.text.toInt()
                                if (finalnum == 0) {
                                    endpage = -1
                                } else if (finalnum % 10 == 0) {
                                    endpage = finalnum / 10
                                } else {
                                    endpage = finalnum / 10 + 1
                                }
                                btotal = false

                            }
                        }
                    }

                    XmlPullParser.END_TAG
                    -> if (parser.name == "item") {
                        var data = Data(pbct_no, plnm_nm, ctgr_full, pbct_begn, pbct_cls, pbct_exct_dtm, plnm_dt, plnm_no, plnm_kind_nm, bid_dvsn_nm, org_plnm_no, bid_mtd_nm, tot_amt_unpc_dvsn_nm, dpsl_mtd_nm,prpt_dvsn_nm)
                        ldata.add(data)
                    }

                }
                eventType = parser.next()
            }

Api 데이터를 불러오는 과정에서 빠르게 데이터를 가져오기 위해 Thread와 Runnable을 사용하였습니다.

inner class를 통해 Runnable 구현

inner class WorkerRunnable : Runnable{
        override fun run() {
            TrafficStats.setThreadStatsTag(Thread.currentThread().id.toInt())
            fdata = searchData()
            runOnUiThread(){
                btotal = true
                if (endpage <0) {
                    Toast.makeText(this@RecycleData, "검색 결과가 존재하지 않습니다.", Toast.LENGTH_SHORT).show()
                } else {
                    var adapter = RecyclerAdapter()
                    var data: MutableList<Data> = fdata
                    adapter.listData = data
                    recyclerView.adapter = adapter
                    recyclerView.layoutManager = LinearLayoutManager(this@RecycleData)
                }
               backBut.setOnClickListener{
                   if (count == 1) {
                       Toast.makeText(this@RecycleData, "처음 페이지 입니다.", Toast.LENGTH_SHORT).show()
                   } else {
                       count -= 1
                       var adapter = RecyclerAdapter()
                       val data: MutableList<Data> = searchData()
                       adapter.listData = data
                       recyclerView.adapter = adapter
                       recyclerView.layoutManager = LinearLayoutManager(this@RecycleData)
                   }
               }
                firstBut.setOnClickListener {
                    count = 1
                    var adapter = RecyclerAdapter()
                    val data: MutableList<Data> = searchData()
                    adapter.listData = data
                    recyclerView.adapter = adapter
                    recyclerView.layoutManager = LinearLayoutManager(this@RecycleData)
                }
                goBut.setOnClickListener {
                    if (count == endpage) {
                        Toast.makeText(this@RecycleData, "마지막 페이지 입니다.", Toast.LENGTH_SHORT).show()
                    } else {

                        count += 1
                        var adapter = RecyclerAdapter()
                        val data: MutableList<Data> = searchData()
                        adapter.listData = data
                        recyclerView.adapter = adapter
                        recyclerView.layoutManager = LinearLayoutManager(this@RecycleData)
                    }
                }
            }

        }
    }

Thread 사용

var thread = Thread(WorkerRunnable())
            thread.start()

Screen_Shots

KakaoTalk_20200828_232319976_01 KakaoTalk_20200828_232319976_02

KakaoTalk_20200828_232319976_03 KakaoTalk_20200828_232319976_04


느낀 점

Xml 파싱하는 과정이 정말 많이 어려웠는데 인터넷 검색이나 책 등을 찾아보면서 파싱에 성공했을 때에 정말 많은 뿌듯함을 느낄 수 있었습니다. 그리고 이번 프로젝트에서 처음 코틀린을 공부하고 이를 이용해서 앱을 만들어 보았는데 처음에는 익숙하지 않은 언어라 많이 힘들었지만 개발 과정에서 조금은 익숙해지는 정말 편한 언어라는 생각도 들었고 이번 프로젝트 외에도 더 알아보고 싶은 언어라는 생각이 들었습니다. 그리고 처음하는 팀프로젝트라 혼자 앱이나 코딩을 했을 때와는 생각하고 진행하는 과정이 많이 다르다는 점을 느꼈습니다. 이에 익숙하지 못해 이번에는 생각했던 것만큼의 과정이나 성과가 나오지는 못한 것 같지만, 다음에는 이런 문제점들을 어떻게 극복해서 구성원들과 조금 더 효과적으로 최대의 성과를 낼 수 있을지 생각해볼 수 있는 시간이 되었던 것 같습니다.

onbid's People

Contributors

lungnahahd avatar praclungnaha avatar kimtaehyuk1 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.