2016-12-20 3 views
0

In meiner Android-App muss ich eine Menge HTTP-Anfragen machen, also habe ich mich entschieden, rx java zu versuchen!Wie viele HTTP-Anfragen mit RX Android zu tun?

So funktioniert es jetzt, aber gibt es eine bessere Lösung als nur eine For-Schleife? Manchmal kann es möglich sein, dass ich ungefähr 30 URLs hintereinander habe!

Kann jemand ein Beispiel verlinken, wie man das richtig macht?

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; 
} 

}

Antwort

1

Basierend auf snipped, dass Sie zur Verfügung gestellt, wäre es besser, verwenden

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

Auch würde ich Retrofit with rxjava adapter verwenden vorschlagen und einen Blick in this nehmen, wenn Sie machen wollen parallele Anrufe.