我們會需要將一整個 Array 在兩個 Activity 中傳遞,所以我們需要將我們資料的 Medol Parcelable 。
Android Studio 這裡提供一個相當方便的方式能夠直接導入 Parcelable
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 傳回來的值
本次實作中市搜尋使用者所擁有的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
最後一個步驟就是將我們建立好的 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 的解析,都還不是特別熟悉。
需要再多找幾個例子來練習。