下面的代码仅用于演示目的。这不是开发代码,因此请不要批评“不良做法”。它只是在传达概念。
假设您在方法中,列表为空。
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超出范围的编译器警告。应该将其声明为static或移至Class范围。由于对sub的调用是异步的,因此响应将到达myMethod范围之外的另一个线程。