【问题标题】:RxAndroid `Observable...subscribe` highlighted in Android StudioAndroid Studio 中突出显示的 RxAndroid `Observable...subscribe`
【发布时间】:2019-12-09 18:32:15
【问题描述】:

我正在使用 RxAndroid 将一个字符串从后台线程编组到主线程,并在该主线程上对该字符串执行一些操作:

String stringFromDatabase = readFromDatabase();

Observable.just(stringFromDatabase)
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(new Consumer<String>() {
        @Override
        public void accept(String string) throws Exception {
            webViewFragment.onInjectMessage(string, null);
        }
    });

Android Studio 以黄色突出显示整个 Observable.just... 命令链,当我将鼠标悬停在它上面时告诉我“订阅的结果未使用”。

如果我将.dispose() 添加到链的末尾,突出显示消失,但webViewFragment.onInjectMessage(string, null); 代码不再执行。

我注意到我可以通过在整个方法中添加@SuppressLint("CheckResult") 注释来移除突出显示。

这类似于可以安全忽略的警告,还是我在这里造成了某种内存泄漏或其他问题?这是一种不好的做法吗?

【问题讨论】:

    标签: android android-studio rx-android


    【解决方案1】:

    您必须处理它以避免内存泄漏。尝试在onDestroy内部处理

    Disposable disposable;
    
    String stringFromDatabase = readFromDatabase();
    disposable = Observable.just(stringFromDatabase)
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Consumer<String>() {
                @Override
                public void accept(String string) {
                    webViewFragment.onInjectMessage(string, null);
                }
            });
    
    @Override
    protected void onDestroy() {
        super.onDestroy();
    
        disposable.dispose();
    }
    

    【讨论】:

    • 您提醒我可以从订阅者内部调用 dispose。我认为有一个特殊的订户或允许这样做的东西,这将是理想的,因为我会在致电webViewFragment.onInjectMessage(string, null); 后进行处置。嗯,需要翻看别的项目的一些代码……
    • Observer&lt;String&gt;onSubscribe 通过一次性用品,我想是这样。
    • @DanielF 是的,那就是:)
    • 您确定不处理会造成内存泄漏吗?我已经在 Android Studio 的 Profile 可见以及 StrictMode 开启的情况下进行了一些 for-loop 基准测试,但似乎没有任何迹象表明有任何东西被泄露。除此之外,GitHub 上的示例github.com/amitshekhariitbhu/RxJava2-Android-Samples/blob/… 也没有显式调用 dispose。
    • 我认为如果将一次性分配给变量,它只会造成内存泄漏。
    猜你喜欢
    • 2017-04-06
    • 1970-01-01
    • 1970-01-01
    • 2014-03-15
    • 2015-05-29
    相关资源
    最近更新 更多