下面的代码仅用于演示目的。这不是开发代码,因此请不要批评“不良做法”。它只是在传达概念。
假设您在方法内,列表为空。
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
但是,如果我们执行相同的操作,但是从主线程访问它,则它将起作用。
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范围之外的另一个线程。
关于multithreading - RxJava和多线程变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60534691/