How to do a lot of http requests with rx android?

1.5k Views Asked by At

in my Android app i have to do a lot of http requests, so I decided to try rx java to do that!

This is how im doing it now, but is there a better solution than just use a for loop? Sometimes it can be possible that I have about 30 urls in a row!

Can someone link an example how to do this the right way?

public class MainActivity extends AppCompatActivity {

private Subscription subscription;
private TextView tvCard;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    tvCard = (TextView) findViewById(R.id.tvCards);
    tvCard.setMovementMethod(new ScrollingMovementMethod());

    for(int i =0;i<=20;i++){

        subscription = observableCardByUrl("https://blabla.com")                    
                .subscribeOn(Schedulers.io())    should be done
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Subscriber<Types>() {
                    @Override
                    public void onCompleted() {

                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.e(TAG, e.getMessage(), e);
                    }

                    @Override
                    public void onNext(Types types) {
                            tvCard.append(types.String + "\n");
                    }
                });
    }
}

public Observable<Types> observableCardByUrl(final String url) {
    return Observable.defer(new Func0<Observable<Types>>() {
        @Override
        public Observable<Types> call() {
            try {
                return Observable.just(getCard(url));
            } catch (IOException e) {
                return null;
            }
        }
    });
}


@Nullable
private Types getCard(String url) throws IOException {
    OkHttpClient okHttpClient = new OkHttpClient();

    Request request = new Request.Builder()
            .url(url)
            .build();


    Response response = okHttpClient.newCall(request).execute();
    if (response.isSuccessful()) {
        Types types = new             Gson().fromJson(response.body().charStream(), Types.class);
        return types;
    }
    return null;
}

}

1

There are 1 best solutions below

0
On

Based on snipped that you provided, it would be better to use

            Observable.range(0, 20)
            .flatMap(integer -> observableCardByUrl("https://blabla.com"))
            .subscribeOn(Schedulers.io())
            .observeOn(...)

Also I would suggest to use Retrofit with rxjava adapter and take a look into this if you want to make parallel calls.