Kotlin開發Android筆記7:Anko獲取網絡數據


—執行一個請求——-

 現在通過請求來獲取顯示在RecyclerView上的數據。我們將會使用OpenWeatherMap API來獲取數據,還有一些普通類來現實這個請求。
Kotlin具有非常強大的互操作性,你可以使用任何你想使用的庫,比如用Retrofit來執行服務器請求。
當只是執行一個簡單的API請求,我們可以不使用任何第三方庫來簡單地實現。而且,Kotlin提供了一些擴展函數來讓請求變得更簡單。
首先,我們要創建一個新的Request類:
public class Request(val url: String) {
public fun run() {
//url是我們傳入的請求地址,通過readText()方法就可以直接返回數據
val forecastJsonStr = URL(url).readText()
//打印返回的json格式數據
Log.d(javaClass.simpleName, forecastJsonStr)
}
}
readText,這是Kotlin標准庫中的擴展函數。該方法不推薦結果很大的響應,但是在這個例子中已經足夠好了。

和Java相比,你會發現我們僅使用標准庫就節省了大量的代碼。
比如HttpURLConnection、BufferedReader和需要的迭代結果,管理連接狀態、reader等部分的代碼。
很明顯,這些就是場景背后函數所作的事情,但是我們卻不用關心。
當然前提是我們需要在AndroidManifest.xml中添加:
//添加網絡訪問權限
<uses-permission android:name="android.permission.INTERNET" />

–在主線程以外執行請求——–

 我們知道,在Android開發中HTTP請求不被允許在UI線程(主線程)中執行。這是因為阻塞住UI線程是一個非常差的體驗。
Android中通用的做法是使用AsyncTask,但是使用它們無任何副作用地實現功能也是非常困難的。
如果你使用不小心,AsyncTasks會非常危險,因為當運行到postExecute時,如果Activity已經被銷毀了,這里就會崩潰。

Anko提供了非常簡單的DSL(領域特定語言(domain-specific languages,簡稱DSL))來處理異步任務,它滿足大部分的需求。
它提供了一個基本的async函數執行代碼,也可以選擇通過調用uiThread的方式回到主線程。在子線程中執行請求如下這么簡單:
async() {
Request(url).run()
uiThread { longToast("Request performed") }
}
 UIThread有一個很不錯的一點就是可以依賴於調用者。如果它是被一個Activity調用的。
如果activity.isFinishing()返回true,則uiThread不會執行,這樣就不會在Activity銷毀的時候遇到崩潰的情況了。

假如你想使用Future來工作,async返回一個Java Future。如果你需要一個返回結果的Future,你可以使用asyncResult。

而且比AsyncTasks更加具有可讀性。現在,我僅僅給請求發送了一個url,來測試我們是否可以正確接收內容,這樣我們才能在Activity中把它畫出來。

學習資料來源《Kotlin for Android Developers》中文翻譯


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com