将事件链接在一起的更好方法是什么?

时间:2018-02-15 17:31:21

标签: android rx-java2

我有一段代码,我试图转换为rxjava。我需要

  1. 创建一个对象(异步调用)
  2. 添加电话号码(同步通话)
  3. 查看它是否存在于数据库中(异步调用)
  4. 如果没有,请将其添加到数据库中。 (异步调用)
  5. 这是我写的代码。我是RxJava的新手。

    private fun createContactPhoneNumbers(email : Email, phoneNumber: PhoneNumber) {
    
        val single = SingleOnSubscribe<ContactPhoneNumbers> { e: SingleEmitter<ContactPhoneNumbers> ->
                val contactPhoneNumber = ContactPhoneNumbers(email)
                e.onSuccess(contactPhoneNumber)
    
        }
    
        var contactPhoneNumber : ContactPhoneNumbers? = null
        val completableOnSubscribe : CompletableOnSubscribe? = null
    
        Single.create(single)
                .subscribeOn(Schedulers.io())
                .map { t ->
                    t.addPhoneNumber(phoneNumber)
                    contactPhoneNumber = t
                    val completableOnSubscribe = CompletableOnSubscribe {
                        t.linkEmailAndTextTogether(phoneNumber)
                    }
                    t.doesEmailContactExist(phoneNumber)
    
                }
                .flatMapCompletable { t: Boolean ->
                    if (t) {
                        completableOnSubscribe
                    }
                    Completable.complete()
                }
    
    
    }
    

1 个答案:

答案 0 :(得分:0)

这是我的工作方式:

      Single.just(phoneNumber)
            .subscribeOn(Schedulers.io())
            .map { it -> it.doesPhoneNumberExistInDatabase() }
            .doOnError { t: Throwable -> Timber.e(t, t.localizedMessage) }
            .map { it ->
                    if (!it) {
                        phoneNumber.insertphoneNumber()
                    }
            }
            .doOnError { t: Throwable -> Timber.e(t, t.localizedMessage) }
            .flatMapCompletable { it->
                val params = arrayOf(phoneNumber.number, it.toString())
                GetNumberObservable.getNumberCompleteable(this@PopUpContactActivity, *params)
            }
            .subscribe(object : CompletableObserver {
                override fun onComplete() {
                    //do nothing
                }

                override fun onSubscribe(d: Disposable) {
                    compositeDisposable.add(d)
                }

                override fun onError(e: Throwable) {
                    Timber.e(e, e.localizedMessage)
                }

            });