Я использую API-интерфейс Facebook для поиска пользователей, которым нравились мои сообщения. Вся логика реализуется в несколько этапов:Как преобразовать многие AsyncTasks в Rx Observables в Android?
- Найти все сообщения от делая запрос API в AsyncTask
- Преобразовать это АТ к Rx.Observable
- Карта Наблюдаемые GraphResponse к списку (Столб POJO)
- вызовов FlatMap и в нем метод вызова тела, который выполняет итерацию каждого сообщения и делает asyncTask, а затем преобразовывает его в Observable и помещает в Array.
- Объединить массив наблюдаемых в одном наблюдаемом.
- Карта его GraphResponse к Понравилось Профиль
- Подпишитесь и визуализации Перечислите Те, кому нравится
- ПРИБЫЛЬ!
И у меня есть небольшая проблема на шаге 4-5. Пожалуйста, посмотрите метод «любит» в репозитории. В комментариях я писал о проблемах
Подсказка: Я использую MVP + Clean Architecture с Repository (слой данных) и Interactor (бизнес слой)
class FacebookRepository {
private val facebook = Facebook.instance()
private val gson = GsonBuilder().create()
fun posts(): Observable<GraphResponse>? {
return RxDecorator<GraphResponse>().decorate(Observable.defer({
val request = GraphRequest(
facebook.token,
"/me/posts",
null,
HttpMethod.GET,
GraphRequest.Callback { /* handle the result */ }
)
Observable.just(request.executeAndWait())
}))
}
fun setFaceBookAccessToken(currentAccessToken: AccessToken?) {
facebook.token = currentAccessToken
}
fun logout() {
facebook.logout()
}
fun token(): String? {
return facebook.token?.token
}
fun likes(posts: List<Post>?): Observable<List<Profile>> {
Log.d("observables:posts", posts.toString())
val p = iterateObservables(posts) // STOP HERE and WAIT to complete this method.
// Then p is composite - merge and return
return Observable.merge(p).map {
Log.d("merge:posts", it.toString())
val profiles = gson.fromJson<List<Profile>>(
it.jsonObject["data"].toString(),
object : TypeToken<List<Profile>>() {}.type
)
[email protected] profiles
}
}
private fun iterateObservables(posts: List<Post>?): MutableList<Observable<GraphResponse>>? {
val observables: MutableList<Observable<GraphResponse>>? = null
Log.d("iterateObs:posts", posts.toString())
Log.d("posts_not_null", (posts != null).toString())
Log.d("posts.size", posts?.size.toString())
if (posts != null) {
for (post in posts) {
Log.d("iterateObs:post", post.toString())
val request = GraphRequest(
AccessToken.getCurrentAccessToken(),
"/${post.id}/likes",
null,
HttpMethod.GET,
GraphRequest.Callback { Log.d("fb:post:id", "${post.id}: ${it.jsonObject}")
}).executeAsync()
Log.d("obs:after:post", observables.toString())
}
}
return observables
}
}
И это Interactor
class FacebookInteractor {
private val callbackManager = com.facebook.CallbackManager.Factory.create()
private val repository = FacebookRepository()
fun facebookAuth(view: IMainView) {
LoginManager
.getInstance()
.logInWithReadPermissions(
view.getContext() as MainActivity,
Arrays.asList("user_friends", "user_likes", "user_posts", "public_profile", "email")
)
}
fun onFacebookLoginResult(requestCode: Int, resultCode: Int, data: Intent) {
callbackManager.onActivityResult(requestCode, resultCode, data)
}
fun facebookAccessTokenChanged(oldAccessToken: AccessToken?, currentAccessToken: AccessToken?) {
if(oldAccessToken?.token != currentAccessToken?.token) {
repository.setFaceBookAccessToken(currentAccessToken)
}
}
fun likes(): Observable<List<Profile>>? {
return repository.posts()?.map {
val gson = GsonBuilder().create()
val posts = gson.fromJson<List<Post>>(
it.jsonObject["data"].toString(),
object : TypeToken<List<Post>>() {}.getType()
)
[email protected] posts
}?.flatMap {
[email protected] repository.likes(it)
}
}
fun logout() {
repository.logout()
}
fun isLogined(): Boolean {
return repository.token() != null
}
}
Я использую Kotlin как язык разработки.
В чем проблема? Почему ваш код не удовлетворяет вас? Пожалуйста, укажите это в вопросе. – voddan
Пожалуйста, посмотрите метод 'likes' в репозитории. В комментариях я писал проблемы – Scrobot
Вы хотите остановить выполнение этого метода до тех пор, пока не поступит ответ? Вы можете использовать Future для этого –