Can/should 我在 Kotlin 中按顺序编写这些相互依赖的 Volley 调用?
Can/should I write these interdependent Volley calls sequentially in Kotlin?
我是第一次在 Android Studio 中使用 Kotlin 编写 Android 应用程序。我对异步编程很陌生。
该应用程序将向用户显示一些数据,这些数据将使用 Volley 从 REST API 中获取。要一起显示一组有意义的数据,需要来自三个 GET 请求的响应。
第一个 GET 请求不需要其他两个 GET 请求的输出来设置其查询参数。
第二个和第三个 GET 请求都需要第一个 GET 请求的输出来设置它们的查询参数,但它们不依赖于彼此的输出,所以这两个请求中的哪个并不重要先叫或 returns。
一旦所有三个请求都得到 returned 响应,结果将组合成一些有意义的信息显示给用户。
我实现它的方法是从我的顶级例程调用第一个 GET 请求,然后从第一个请求的响应侦听器函数内部顺序调用第二个和第三个请求。从第二个和第三个请求的响应侦听器函数中调用组装信息并将其显示给用户的最终函数;这个 final 函数首先将计数器加 1,然后只有当计数器的值达到 2 时才执行剩余的工作,这意味着只有当函数被后者的第二个调用时才会执行工作对 return.
的两个请求
我觉得如果我能以这样一种方式编写代码,使所有三个 Volley GET 请求都可以从我的顶部顺序调用,那会“更好”(在某种程度上我不太清楚如何描述)级例程,然后是在我的顶级例程中调用这些 GET 请求后按顺序向用户组装和显示数据。
这似乎要求对第二个和第三个 GET 请求的调用在第一个请求 returned 之前不“触发”,并且汇编和显示代码不“触发”直到所有三个请求都已 returned。但是我不知道怎么用Kotlin表达。
有没有一种漂亮、整洁、标准的方法让我按顺序编写这段代码,或者我是否应该停止认为顺序编写这段代码会更好?
正如我在评论中提到的,最惯用的 Kotlin 方式是使用协程。
这是一个例子:
您将 API 调用标记为 suspend 函数:
interface ApiService {
@GET("foo")
suspend fun getFoo(): Foo
@GET("bar1")
suspend fun getBar1(): Bar1
@GET("bar2")
suspend fun getBar2(): Bar2
}
我们创建该接口的实例(有关详细信息,请参阅 Retrofit documentation):
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.my-website.com/")
.addConverterFactory(GsonConverterFactory.create())
.build();
GitHubService service = retrofit.create(GitHubService.class);
然后,我们先调用foo
,然后调用bar1
和bar2
。我们终于等到两个都这样完成了。
GlobalScope.launch{
val fooResult = service.getFoo()
// you can use fooResult if you need for arguments of the other two.
// you fire both events, and get a Deferrable to it.
val deferrableBar1 = async { service.getBar1() }
val deferrableBar2 = async { service.getBar2() }
// call await() for both. This makes sure that you get results of both before you continue.
val bar1Result = deferrableBar1.await()
val bar2Result = deferrableBar2.await()
// use the results from API
showInUI(fooResult,bar1Result,bar2Result)
}
请注意,您必须将 try-catch
添加到处理错误的调用中。
我是第一次在 Android Studio 中使用 Kotlin 编写 Android 应用程序。我对异步编程很陌生。
该应用程序将向用户显示一些数据,这些数据将使用 Volley 从 REST API 中获取。要一起显示一组有意义的数据,需要来自三个 GET 请求的响应。
第一个 GET 请求不需要其他两个 GET 请求的输出来设置其查询参数。
第二个和第三个 GET 请求都需要第一个 GET 请求的输出来设置它们的查询参数,但它们不依赖于彼此的输出,所以这两个请求中的哪个并不重要先叫或 returns。
一旦所有三个请求都得到 returned 响应,结果将组合成一些有意义的信息显示给用户。
我实现它的方法是从我的顶级例程调用第一个 GET 请求,然后从第一个请求的响应侦听器函数内部顺序调用第二个和第三个请求。从第二个和第三个请求的响应侦听器函数中调用组装信息并将其显示给用户的最终函数;这个 final 函数首先将计数器加 1,然后只有当计数器的值达到 2 时才执行剩余的工作,这意味着只有当函数被后者的第二个调用时才会执行工作对 return.
的两个请求我觉得如果我能以这样一种方式编写代码,使所有三个 Volley GET 请求都可以从我的顶部顺序调用,那会“更好”(在某种程度上我不太清楚如何描述)级例程,然后是在我的顶级例程中调用这些 GET 请求后按顺序向用户组装和显示数据。
这似乎要求对第二个和第三个 GET 请求的调用在第一个请求 returned 之前不“触发”,并且汇编和显示代码不“触发”直到所有三个请求都已 returned。但是我不知道怎么用Kotlin表达。
有没有一种漂亮、整洁、标准的方法让我按顺序编写这段代码,或者我是否应该停止认为顺序编写这段代码会更好?
正如我在评论中提到的,最惯用的 Kotlin 方式是使用协程。
这是一个例子:
您将 API 调用标记为 suspend 函数:
interface ApiService {
@GET("foo")
suspend fun getFoo(): Foo
@GET("bar1")
suspend fun getBar1(): Bar1
@GET("bar2")
suspend fun getBar2(): Bar2
}
我们创建该接口的实例(有关详细信息,请参阅 Retrofit documentation):
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.my-website.com/")
.addConverterFactory(GsonConverterFactory.create())
.build();
GitHubService service = retrofit.create(GitHubService.class);
然后,我们先调用foo
,然后调用bar1
和bar2
。我们终于等到两个都这样完成了。
GlobalScope.launch{
val fooResult = service.getFoo()
// you can use fooResult if you need for arguments of the other two.
// you fire both events, and get a Deferrable to it.
val deferrableBar1 = async { service.getBar1() }
val deferrableBar2 = async { service.getBar2() }
// call await() for both. This makes sure that you get results of both before you continue.
val bar1Result = deferrableBar1.await()
val bar2Result = deferrableBar2.await()
// use the results from API
showInUI(fooResult,bar1Result,bar2Result)
}
请注意,您必须将 try-catch
添加到处理错误的调用中。