2016-01-26 2 views
0

Я хочу использовать RxAndroid в моем проекте, и я сделать сон нити для 50мса но это вызвало апг, кодКак изменить Планировщики в RxAndroid?

public void getTypeAndCommodity() { 
    Observable.from(getCommodities()) 
      .subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(new Subscriber<Commodity>() { 
       @Override 
       public void onCompleted() { 

       } 

       @Override 
       public void onError(Throwable e) { 

       } 

       @Override 
       public void onNext(Commodity commodity) { 
       } 
      }); 
} 

и getCommodities:

private ArrayList<Commodity> getCommodities() { 
    // some test info 
    ArrayList<Commodity> list = new ArrayList<>(); 
    for (int i = 0; i < 99; i++) { 
     Commodity commodity = new Commodity(); 
     try { 
      Thread.sleep(50); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     commodity.setName("name" + i); 
     commodity.setType("type" + (i + 1)/10); 
     list.add(commodity); 
    } 
    return list; 
} 

почему это вызывает ANR ? пожалуйста, помогите

ответ

0

Это происходит потому, что getCommodities() выполняется в основном потоке, и только один из них испускается из-за потока с помощью subscribeOn (Schedulers.io()). Если вы хотите выполнить getCommidities() в фоновом потоке тоже нужно создать наблюдаемый с DEFER() метод:

Observable.defer(new Func0<Observable<Object>>() { 
     @Override public Observable<Object> call() { 
      return Observable.from(getCommodities()); 
     } 
    }).subscribeOn(Schedulers.io())... 

Если вам нужна дополнительная информация: http://blog.danlew.net/2015/07/23/deferring-observable-code-until-subscription-in-rxjava/

Смежные вопросы