RxJava和多线程变量



下面的代码仅用于演示。这不是开发代码,所以请不要批评"不良做法"。它只是用来传达概念的。

假设你在一个方法中,有一个空列表。

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

我在其他案例中也看到过类似的情况,但我不知道为什么。是因为每个线程都有自己的堆栈/内存区域吗?

我很惊讶您没有收到编译器关于myList超出范围的警告。应将其声明为静态或移动到Class作用域。由于对sub的调用是异步的,因此响应将到达myMethod范围之外的另一个线程。

最新更新