您的位置:首页 > 理论基础 > 计算机网络

Kotlin开发Android笔记7:Anko获取网络数据

2016-08-03 14:22 351 查看
—执行一个请求——-

现在通过请求来获取显示在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》中文翻译
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: