Код ниже только для демонстрационных целей. Это не код разработки, поэтому, пожалуйста, не критикуйте "плохую практику". Это только для передачи концепций.
Скажем, вы внутри метода с нулевым списком.
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
}
}
Я был свидетелем чего-то подобного в других случаях, но я оступился почему. Это потому, что каждый поток имеет свой собственный стек / область памяти?