Rx Java и многопоточные переменные - PullRequest
2 голосов
/ 05 марта 2020

Код ниже только для демонстрационных целей. Это не код разработки, поэтому, пожалуйста, не критикуйте "плохую практику". Это только для передачи концепций.

Скажем, вы внутри метода с нулевым списком.

public void myMethod() {
  List<Strings> myList = new ArrayList<>(); 
} 

Прямо под определением myList выполняется многопоточный асинхронный вызов RX с выдуманным обратным вызовом для возврата результатов. Давайте перейдем к Schedulers.io () и посмотрим на AndroidSchedulers.mainThread () .

getMyStuff.subOn(Schedulers.io()).obsOn(AndroidSchedulers.mainThread()).subscribe(new Callback(){
      @Override
      public void onDone(List<String> list){
          myList.addAll(list);
      }
})

Если мы поместим временно блок ниже этого, и попробуем для доступа к myList это будет null.

Thread.wait(5000);

Assert.true(myList.size() > 0) --> False

Однако, если мы сделаем то же самое, но получим доступ к нему из потока main , он будет работать.

Thread.wait(5000);

RunOnMainThread { //--> This can be done any number of ways.
  Assert.true(myList.size() > 0) --> True
}

Весь работающий код будет выглядеть как

public void myMethod() {
  List<Strings> myList = new ArrayList<>();

  getMyStuff.subOn(Schedulers.io()).obsOn(AndroidSchedulers.mainThread()).sub(new Callback(){
      @Override
      public void onDone(List<String> list){
          myList.addAll(list);
      }
   })

  Thread.wait(5000);

  RunOnMainThread { //--> This can be done any number of ways.
     Assert.true(myList.size() > 0) --> True
  }
} 

Я был свидетелем чего-то подобного в других случаях, но я оступился почему. Это потому, что каждый поток имеет свой собственный стек / область памяти?

1 Ответ

0 голосов
/ 13 марта 2020

Я удивлен, что вы не получите предупреждение компилятора о том, что myList находится вне области видимости. Он должен быть объявлен как stati c или перемещен в область действия Class. Поскольку вызов sub является асинхронным, ответ поступит в другой поток, выходящий за рамки myMethod.

...