RxJava和多线程变量

问题描述 投票:0回答:1

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

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

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

我目睹了其他情况下发生的类似情况,但是我迷失了原因。是因为每个线程都有自己的内存堆栈/区域吗?

multithreading scope rx-java rx-java2 race-condition
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.