執(zhí)行一個(gè)請(qǐng)求
對(duì)于感受我們要實(shí)現(xiàn)的想法而言皮获,我們目前的文本是很好開(kāi)始如叼,但是現(xiàn)在是時(shí)候去請(qǐng)求一些顯示在RecyclerView上的真正的數(shù)據(jù)了嘉涌。我們將會(huì)使用OpenWeatherMap API來(lái)獲取數(shù)據(jù)饼丘,還有一些普通類(lèi)來(lái)現(xiàn)實(shí)這個(gè)請(qǐng)求。多虧Kotlin非常強(qiáng)大的互操作性,你可以使用任何你想使用的庫(kù)卫病,比如用Retrofit來(lái)執(zhí)行服務(wù)器請(qǐng)求油啤。當(dāng)只是執(zhí)行一個(gè)簡(jiǎn)單的API請(qǐng)求,我們可以不使用任何第三方庫(kù)來(lái)簡(jiǎn)單地實(shí)現(xiàn)蟀苛。
而且君丁,如你所見(jiàn)灶似,Kotlin提供了一些擴(kuò)展函數(shù)來(lái)讓請(qǐng)求變得更簡(jiǎn)單记某。首先净神,我們要?jiǎng)?chuàng)建一個(gè)新的Request類(lèi):
public class Request(val url: String) {
public fun run() {
val forecastJsonStr = URL(url).readText()
Log.d(javaClass.simpleName, forecastJsonStr)
}
}
我們的請(qǐng)求很簡(jiǎn)單地接收一個(gè)url蝠猬,然后讀取結(jié)果并在logcat上打印json杈女。實(shí)現(xiàn)非常簡(jiǎn)單淑掌,因?yàn)槲覀兪褂?code>readText,這是Kotlin標(biāo)準(zhǔn)庫(kù)中的擴(kuò)展函數(shù)抛腕。這個(gè)方法不推薦結(jié)果很大的響應(yīng),但是在我們這個(gè)例子中已經(jīng)足夠好了摔敛。
如果你用這些代碼去比較Java全封,你會(huì)發(fā)現(xiàn)我們僅使用標(biāo)準(zhǔn)庫(kù)就節(jié)省了大量的代碼马昙。比如HttpURLConnection
刹悴、BufferedReader
和需要達(dá)到相同效果所必要的迭代結(jié)果,管理連接狀態(tài)土匀、reader等部分的代碼。很明顯证杭,這些就是場(chǎng)景背后函數(shù)所作的事情妒御,但是我們卻不用關(guān)心。
為了可以執(zhí)行請(qǐng)求携丁,App必須要有Internet權(quán)限兰怠。所以需要在AndroidManifest.xml
中添加::
<uses-permission android:name="android.permission.INTERNET" />
在主線(xiàn)程以外執(zhí)行請(qǐng)求
如你所知李茫,HTTP請(qǐng)求不被允許在主線(xiàn)程中執(zhí)行,否則它會(huì)拋出異常魄宏。這是因?yàn)樽枞I線(xiàn)程是一個(gè)非常差的體驗(yàn)。Android中通用的做法是使用AsyncTask
味榛,但是這些類(lèi)是非常丑陋的,并且使用它們無(wú)任何副作用地實(shí)現(xiàn)功能也是非常困難的搏色。如果你使用不小心券册,AsyncTasks
會(huì)非常危險(xiǎn),因?yàn)楫?dāng)運(yùn)行到postExecute
時(shí)烁焙,如果Activity已經(jīng)被銷(xiāo)毀了,這里就會(huì)崩潰膳殷。
Anko提供了非常簡(jiǎn)單的DSL來(lái)處理異步任務(wù)九火,它滿(mǎn)足大部分的需求赚窃。它提供了一個(gè)基本的async
函數(shù)用于在其它線(xiàn)程執(zhí)行代碼吃既,也可以選擇通過(guò)調(diào)用uiThread
的方式回到主線(xiàn)程跨细。在子線(xiàn)程中執(zhí)行請(qǐng)求如下這么簡(jiǎn)單:
async() {
Request(url).run()
uiThread { longToast("Request performed") }
}
UIThread
有一個(gè)很不錯(cuò)的一點(diǎn)就是可以依賴(lài)于調(diào)用者。如果它是被一個(gè)Activity
調(diào)用的震叙,那么如果activity.isFinishing()
返回true
散休,則uiThread
不會(huì)執(zhí)行,這樣就不會(huì)在Activity銷(xiāo)毀的時(shí)候遇到崩潰的情況了戚丸。
假如你想使用Future
來(lái)工作扔嵌,async
返回一個(gè)Java Future
夺颤。而且如果你需要一個(gè)返回結(jié)果的Future
,你可以使用asyncResult
独旷。
真的很簡(jiǎn)單,對(duì)吧寥裂?而且比AsyncTasks
更加具有可讀性。現(xiàn)在封恰,我僅僅給請(qǐng)求發(fā)送了一個(gè)url,來(lái)測(cè)試我們是否可以正確接收內(nèi)容回溺,這樣我們才能在Activity中把它畫(huà)出來(lái)混萝。我很快會(huì)講到怎么去進(jìn)行json解析和轉(zhuǎn)換成app中的數(shù)據(jù)類(lèi),但是在我們繼續(xù)之前逸嘀,學(xué)習(xí)什么是數(shù)據(jù)類(lèi)也是很重要的。
檢查代碼并審查url請(qǐng)求和包結(jié)構(gòu)的代碼翼岁。你可以運(yùn)行app并且確保你可以在打印的json日志和請(qǐng)求完畢之后的toast司光。