I have an activity on which I make a network request everytime the user input changes.
The api definition is as follows:
interface Api {
  @GET("/accounts/check")
  fun checkUsername(@Query("username") username: String): Observable<UsernameResponse>
}
Then the services that manages it all:
class ApiService {
  var api: Api
  init {
    api = retrofit.create(Api::class.java)
  }
  companion object {
    val baseUrl: String = "https://someapihost"
    var rxAdapter: RxJava2CallAdapterFactory = RxJava2CallAdapterFactory.create()
    val retrofit: Retrofit = Retrofit.Builder()
            .baseUrl(baseUrl)
            .addConverterFactory(GsonConverterFactory.create())
            .addCallAdapterFactory(rxAdapter)
            .build()
}
  fun checkUsername(username: String): Observable<UsernameResponse> {
    return api.checkUsername(username)
  }
}
Then inside my activity, whenever the EditText content changes, I make this call:
  private fun checkUsername(username: String) {
      cancelSubscription()
      checkUsernameDisposable = ApiService()
            .checkUsername(username)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe {
              updateUi(it)
      }
  }
So this is creating a new disposable every time the input changes. This is obviously incorrect. What I want to do is to update the existing subscription with the results of the new network call.
 
    