2017-09-20 4 views
0

J'ai un travail simple qui consiste à sélectionner des données en utilisant GreenDao. Aussi je veux montrer ProgressWheel, mais ce travail bloque le fil de l'interface utilisateur.RxAndroid bloque le fil d'interface utilisateur

showLoader(); 

    DataManager.getInstance(this).getQuestions(0, 800) 
      .subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .map(QuestionUtils::shuffleAnswers) 
      .subscribe(this::onFinishLoad); 

Et

public Observable<List<Question>> getQuestions(int offset, int limit) { 
      return Observable.fromCallable(() -> daoSession.getQuestionDao().queryBuilder() 
      .offset(offset) 
      .limit(limit) 
      .build().list()); 
} 

Répondre

3

Il bloque à cause de l'ordre de vos opérations.

DataManager.getInstance(this) 
     .getQuestions(0, 800) 
     .map(QuestionUtils::shuffleAnswers) 
     .subscribeOn(Schedulers.io()) 
     .observeOn(AndroidSchedulers.mainThread()) 
     .subscribe(this::onFinishLoad); 

devrait le résoudre. Sinon, vous inscrire des données et les mapper après.

Si vous voulez terminer le chargement d'une de vos données, vous pouvez utiliser l'action dans votre méthode d'abonnement et traiter le chargement dans votre nextData émis.

.subscribe (nextData -> {}, error -> {},() -> doCompletedStuff())