gpt4 book ai didi

multithreading - RxJava和多线程变量

转载 作者:行者123 更新时间:2023-12-03 13:07:33 25 4
gpt4 key购买 nike

下面的代码仅用于演示目的。这不是开发代码,因此请不要批评“不良做法”。它只是在传达概念。

假设您在方法内,列表为空。

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com