iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 16
0

GithubSearch

GithubSearch

Parcelable

我們會需要將一整個 Array 在兩個 Activity 中傳遞,所以我們需要將我們資料的 Medol Parcelable 。

Android Studio 這裡提供一個相當方便的方式能夠直接導入 Parcelable

Parcelable

okHttp3


val username = userNameEditText.text

        val client = OkHttpClient()
        val request = Request.Builder()
                .url("https://api.github.com/users/$username/repos")
                .build()

我們透過 EditText 取得使用者輸入的值,並將值帶入 url 建立 request


client.newCall(request).enqueue(object : Callback {
            
            override fun onFailure(call: okhttp3.Call, e: IOException) {}

            override fun onResponse(call: okhttp3.Call, response: Response){}

我們透過 okHttpCline 建立 newCall 並將我們的 request 帶入,透過立名類別來 override onFailure 與 onResponse

我們可以透過 onResponse 的參數 response 來取得 Service 傳回來的值

JSON 解析

本次實作中市搜尋使用者所擁有的repos

所以 GitHub API 回傳的是該名作者所有的 repo 資訊並用 JSONArray 包裝

所以我們需要解析該 JSONArray


override fun onResponse(call: okhttp3.Call, response: Response) {

                val responseData = response.body()?.string()
                val json = JSONArray(responseData)
                val projects: ArrayList<GithubData> = ArrayList()

我們在這裡將 response 資料取下,建立一個 JSONArray 將所回傳的資料放入。
然後建立一個 ArrayList 方便等一下我們將解析的資料一同放入。


for(i in 0..(json.length() - 1)){

                    val item = json.getJSONObject(i)

                    val owner = item.getJSONObject("owner")
                    val ownerName = owner.get("login").toString()
                    val projectName = item.get("name").toString()
                    val description = item.get("description").toString()
                    val starCount = item.get("stargazers_count").toString().toInt()
                    val forkCount = item.get("forks_count").toString().toInt()

                    val project = GithubData(projectName, description, starCount, forkCount, ownerName)
                    projects.add(project)
                }

解析 JSONArray 有以下兩點需要特別注意

1.Github 所回傳的資料中順序都是由0開始

2.有些資料包裝在 owner 下面(如 ownerName ),我們可以透過以上方法進入 owner 層後取得資料。

最後我們將所取得的資料加入我們前一步建立的 ArrayList

Intent ParcelableArrayList

最後一個步驟就是將我們建立好的 ArrayList 傳送到另外一個 Activity 中作運用啦

MainActivity


val intent = Intent(this@MainActivity, SearchResultActivity::class.java)
                intent.putParcelableArrayListExtra("projects", projects)
                startActivity(intent)

SearchResultActivity


val projects: ArrayList<GithubData> = intent.extras.getParcelableArrayList("projects")

這樣就可以完成 ArrayList 的傳送囉。

結語

這次實作中也有遇到 RecyclerView 的應用,但就不多加著墨了。

這次實作項目對我來說棘手的是資料的處理,無論是 ArrayList 的運用或是 JSON 的解析,都還不是特別熟悉。

需要再多找幾個例子來練習。


上一篇
Day15_ImageSlider
下一篇
Day17_LocalStorage
系列文
發現新大陸-Android Kotlin 開發之路30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言