kotlin、Rx、Retrofit2 のスキルを向上させるために、デモ プロジェクトを行うことにしました。デモ プロジェクトは、リサイクラー ビューで投稿を表示し、詳細アクティビティで投稿の詳細を表示することで構成されます。
ユーザー名、タイトル、投稿の本文、投稿のコメント数など、さまざまな API 呼び出しからのデータを表示する際に問題が発生しました。
私の問題は、複数のリクエストを行い、詳細アクティビティに表示するために必要なすべてのデータを取得したいということです。つまり、ユーザー名を取得するための呼び出しを行い、次に投稿に対するコメントの数を取得するための呼び出しを行うということです。投稿のタイトルと本文は、メイン アクティビティで行われたリクエストから来ています。バンドルと一緒に詳細アクティビティに送信するだけです。
API 呼び出し:
// 投稿 1 のコメントを返します
http://jsonplaceholder.typicode.com/comments?postId=1
// ユーザー 2 の情報を返す
http://jsonplaceholder.typicode.com/users/2
// メイン アクティビティで投稿を表示するために使用される呼び出し
http://jsonplaceholder.typicode.com/posts
私はまだ Rx の初心者です。flatMap を使用することを考えていましたが、kotlin で Flowable を使用する方法がわかりません。
var post = viewModel.getPost()
var userStream: Flowable<User> = postService.getUser(post.userId)
var commentsByPostIdCall: Flowable<List<Comment>> = postService.getCommentsByPostId(post.id)
userStream.subscribeOn(Schedulers.io())
.subscribe(object : Subscriber<User> {
override fun onError(t: Throwable?) {
Log.d(this.toString(), " Read of users failed with the following message: " + t?.message);
}
override fun onNext(user: User) {
userTextView.text = user.name
title.text = post.title
body.text = post.body
}
override fun onComplete() {
}
override fun onSubscribe(s: Subscription?) {
if (s != null) {
s.request(1)
}
}
})
メソッドgetNumberCommentsに 2 番目の呼び出しを入れました。
private fun getNumberComments(commentsByPostIdCall: Flowable<List<Comment>>): Int {
var listComments = listOf<Comment>()
var listCommentSize = 0
commentsByPostIdCall
.subscribeOn(Schedulers.io())
.subscribe(object : Subscriber<List<Comment>> {
override fun onError(t: Throwable?) {
Log.d(this.toString(), " Read of comments failed with the following message: " + t?.message);
}
override fun onNext(comment: List<Comment>) {
listComments = comment
}
override fun onComplete() {
print("onComplete!")
listCommentSize = listComments.size
}
override fun onSubscribe(s: Subscription?) {
if (s != null) {
s.request(1)
}
}
})
return listCommentSize
}
私が気付いた他の人は、ストリームがonCompleteに行かないこともあれば、onNextでブロックされたままになることもあると思います。理由がわからない?
どんな助けでも大歓迎です!どうもありがとう :)