1. 云栖社区>
  2. >
  3. 正文

从API中获取数据(七)

作者:用户 来源:互联网 时间:2018-08-30 14:25:43

Kotlin

从API中获取数据(七) - 摘要: 本文讲的是从API中获取数据(七), 一、执行一个请求。通过以上的内容学习,现在是时候去请求一些显示在RecyclerView上的真正的数据。我们将会使用OpenWeatherMap API来获取数据,还有一些普通类来现实这个请求。多亏Kotlin非常强大的互操作

一、执行一个请求。通过以上的内容学习,现在是时候去请求一些显示在RecyclerView上的真正的数据。我们将会使用OpenWeatherMap API来获取数据,还有一些普通类来现实这个请求。多亏Kotlin非常强大的互操作性,比如可以用Retrofit来执行服务器请求。

 当只是执行一个简单的API请求,我们可以不使用任何第三方库来简单地实现。而且,Kotlin提供了一些扩展函数来让请求变得更简单。首先,我们要创建一个新的Request类:
public class Request(val url: String) {
    public fun run() {
        val forecastJsonStr = URL(url).readText()
        Log.d(javaClass.simpleName, forecastJsonStr)
    }
}
我们的请求很简单,就是接收一个url,然后读取结果并在logcat上打印json。实现非常简单,因为我们使用readText,这是Kotlin标准库中的扩展函数。这个方法不推荐用于返回结果很大的响应,但是在这个例子中使用没有一点问题。
如果你用这些代码去比较Java,你会发现我们仅使用标准库就节省了大量的代码。比如HttpURLConnection、BufferedReader和需要达到相同效果所必要的迭代结果,管理连接状态、reader等部分的代码。很明显,这些就是场景背后函数所作的事情,但是我们却不用关心。

就本例而言,为了可以执行请求,App必须要有Internet权限。所以需要在AndroidManifest.xml中添加:
<uses-permission android:name="android.permission.INTERNET" />
二、在主线程以外执行请求。我们都知道HTTP请求不被允许在主线程中执行,否则它会抛出异常。这是因为阻塞住UI线程是一个非常差的体验。Android中通用的做法是使用异步任务AsyncTask,但这个也有不少缺陷。如果你使用不小心,AsyncTasks会非常危险,因为当运行到postExecute时,如果Activity已经被销毁了,这里就会崩溃。

Anko提供了非常简单的DSL来处理异步任务,它满足大部分的需求。它提供了一个基本的async函数用于在其它线程执行代码,也可以选择通过调用uiThread的方式回到主线程。在子线程中执行请求如下这么简单:
async() {
    Request(url).run()
    uiThread { longToast("Request performed") }
}
UIThread有一个很不错的一点就是可以依赖于调用者。如果它是被一个Activity调用的,那么如果activity.isFinishing()返回true,则uiThread不会执行,这样就不会在Activity销毁的时候遇到崩溃的情况了。

假如你想使用Future来工作,async返回一个Java Future。而且如果你需要一个返回结果的Future,你可以使用asyncResult。
由此我们发现,使用async特别的方便。而且比AsyncTasks更加具有可读性。

以上是云栖社区小编为您精心准备的的内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索Kotlin ,以便于您获取更多的相关知识。

弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率

40+云计算产品,6个月免费体验

现在注册,免费体验40+云产品,及域名优惠!

云服务器9.9元/月,大学必备