RxJava concatMap no response

558 Views Asked by At

Hope you guys are doing well, I have been working on a personal Android Project using RxJava and Retrofit. It's a search request for GitHub issues, I am getting input from the user when he clicks Search Button and using a PublishSubject object to emit the search text.

button.setOnClickListener(view -> {
    publishSubject.onNext(editText.getText().toString());
});

and I am mapping this emit to an Observable using retrofit like this

publishSubject.concatMap(dataModel::getIssues)
              .subscribeOn(Schedulers.computation())
              .observeOn(AndroidSchedulers.mainThread())
              .subscribe(this::loadData, this::onError);

public Observable<List<Issue>> getIssues(String queryText) {
    String[] query_params = queryText.split("/");
    return gitHubApiService.getIssues(query_params[0], query_params[1], "open");
}

In result I am expecting List of Issues

public void loadData(List<Issue> issues) {
    mProgressDialog.setVisibility(View.INVISIBLE);

    if( issues.size() == 0) {
        noIssueText.setVisibility(View.VISIBLE);
    } else {
        mRecyclerView.setVisibility(View.VISIBLE);
        mIssuesList.clear();
        mIssuesList.addAll(issues);
        mAdapter.notifyDataSetChanged();
    }
}

But my code seems to have some implementation issue Since it never emits anything from the network, not even on error is called. I have tested the same example with the Observable I get from Retrofit API, so there is no retrofit error and so I think there is some problem with my concatMap logic. Any help will be much appreciated

1

There are 1 best solutions below

4
On BEST ANSWER

On first parse, I think that you might be making the network call in the main thread. Have you tried the following?

public Observable<List<Issue>> getIssues(String queryText) {
  String[] query_params = queryText.split("/");
  return gitHubApiService.getIssues(query_params[0], query_params[1], "open")
       .subscribeOn(Schedulers.io());
}

Thing is, your onClickListener callback runs on the main thread, and there's no other context switch in the observable pipeline.