当前位置: 首页 > 知识库问答 >
问题:

问:RxJava:clear(CompositeDisposable)方法如何在内部工作

凌长恨
2023-03-14

匿名类保存对封闭类的引用。

在下面的示例中,我创建了一个小活动。在onCreate方法中,我只需在另一个线程上添加一个计时器,添加一个CompositeDisposable并在onDestroy中清除它。

显然,如果没有CompositeDisposable,它将导致内存泄漏。使用CompositeDisposable不会造成任何内存泄漏,但它是如何工作的?

RxJava只是中断Thread并在每个回调上置null?你能提供一些在RxJava源代码中执行此工作的行吗,我想它在dispose方法附近的某个地方。

public class MainActivity extends AppCompatActivity {

private String TAG = "MainActivity";

private CompositeDisposable composite = new CompositeDisposable();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    composite.add(Flowable
            .just(1)
            .timer(90, TimeUnit.SECONDS)
            .subscribeOn(Schedulers.io())
            .subscribeWith(new DisposableSubscriber<Long>() {

                @Override
                public void onNext(Long aLong) { sayHello(); }

                @Override
                public void onError(Throwable t) { sayHello(); }

                @Override
                public void onComplete() { sayHello(); }
            }));
}

@Override
protected void onDestroy() {
    super.onDestroy();

    composite.clear();
}

public void sayHello () { Log.w(TAG, "Hello everyone"); }

共有1个答案

支阳波
2023-03-14

它正好位于dispose方法的源代码中。您可能也可以跳转到IDE中库中的方法源,在IntelliJ中,Windows上的方法源是Ctrl,或者⌘在Mac上为B,在Eclipse中为F3。

无论如何,这里是dispose方法(comments mine)的来源:

@Override
public void dispose() {
    if (disposed) { // nothing to do
        return;
    }
    OpenHashSet<Disposable> set; // this is the same type as our field that holds the Disposables
    synchronized (this) {
        if (disposed) { 
            return; // another thread did it while we got our lock, so nothing to do
        }
        disposed = true; // setting this flag is safe now, we're the only ones disposing
        set = resources; // the references are now in this local variable
        resources = null; // our field no longer has the references
    }

    dispose(set); // from here on out, only this method has the references to the Disposables
}

然后是dispose(OpenHashSet)的完整代码

/**
 * Dispose the contents of the OpenHashSet by suppressing non-fatal
 * Throwables till the end.
 * @param set the OpenHashSet to dispose elements of
 */
void dispose(OpenHashSet<Disposable> set) {
    if (set == null) {
        return;
    }
    List<Throwable> errors = null;
    Object[] array = set.keys();
    for (Object o : array) {
        if (o instanceof Disposable) {
            try {
                ((Disposable) o).dispose();
            } catch (Throwable ex) {
                Exceptions.throwIfFatal(ex);
                if (errors == null) {
                    errors = new ArrayList<Throwable>();
                }
                errors.add(ex);
            }
        }
    }
    if (errors != null) {
        if (errors.size() == 1) {
            throw ExceptionHelper.wrapOrThrow(errors.get(0));
        }
        throw new CompositeException(errors);
    }
}

正如您所看到的,在该方法的末尾,现在可以对set进行垃圾收集,因为没有人持有对它的引用。

 类似资料:
  • 问题内容: 我正在阅读有关Java中并发性的Oracle官方文档,但我想知道返回的返回值之间可能有什么区别? 并使用例如 。我假设我用一个。我知道,一般而言,同步集合对于我来说只是一个装饰器,因此很明显a 的内部结构有所不同。您是否有关于这些实施细节的信息? 编辑:我意识到源代码是公开可用的: ConcurrentHashMap.java 问题答案: 我会阅读ConcurrentHashMap的源

  • 问题内容: 我正在使用Eclipse服务器功能进行热代码部署。使用tomcat作为Web服务器。但是我不确定它是如何工作的。我有自己的理解,它必须如何在内部工作。 我的理解:- 当开发人员更改代码(例如,类Employee)时,Eclipse将在正确的位置(必须是特定的Web /应用服务器,将其称为热部署目录(HDD))放置/发布修改后的已编译类。 。现在将显示Web服务器特定的类加载器。它在HD

  • 如何访问main方法中的匿名内部类对象。它给出了编译时错误,称“无法对非静态方法进行静态引用”。如果我将匿名内部类设置为静态,那么我可以访问我想访问的ut,而不必将其设置为静态。 怎么做。请帮帮忙。

  • 问题内容: 我正在尝试装饰类中的方法,但是python抛出错误。我的课看起来像这样: : Python抛出以下错误 我要去哪里玩? 问题答案: Python自动将类实例作为参考传递。(在所有类方法中都可以看到的参数)。 您可以这样做:

  • 如何验证是否调用了。我甚至不能设置mock对象,因为一旦我调用该方法,它就会实例化为null并创建新对象。 我尝试使用

  • 问题内容: “现代” 守护程序如何在 内部 安排作业?有些人经常通过来安排一次跑步。因此,在写出crontab之后,会执行以下操作: 解析crontab以了解所有将来的事件,并hibernate间隔时间? 每分钟轮询一次汇总的crontab数据库,以确定当前时间是否与计划模式匹配? 其他? 谢谢, 问题答案: 在这个问题上听到了几声。不错的RTFC,其中包含一些离散事件模拟论文和Wikipedia