android सदस्यता के परिणाम का उपयोग नहीं किया जाता है




android-studio rx-java2 (4)

मैंने आज एंड्रॉइड स्टूडियो 3.1 में अपग्रेड किया है, जो लगता है कि कुछ और लिंट चेक जोड़े गए हैं। इनमें से एक लिंट चेक एक-शॉट RxJava2 subscribe() कॉल के लिए है जो एक चर में संग्रहीत नहीं है। उदाहरण के लिए, मेरे कक्ष डेटाबेस से सभी खिलाड़ियों की सूची प्राप्त करना:

Single.just(db)
            .subscribeOn(Schedulers.io())
            .subscribe(db -> db.playerDao().getAll());

एक बड़े पीले ब्लॉक और इस टूलटिप में परिणाम:

subscribe परिणाम का उपयोग नहीं किया जाता है

इस तरह से एक-शॉट आरएक्स कॉल के लिए सबसे अच्छा अभ्यास क्या है? क्या मुझे Disposable पकड़ कर रखना चाहिए और पूरा करना चाहिए? या मैं सिर्फ @SuppressLint और आगे बढ़ना चाहिए?

EDIT यह केवल RxJava2 ( io.reactivex ) को प्रभावित करता है, RxJava ( rx ) में यह लिंट नहीं है।


यदि आपको यकीन है कि डिस्पोजेबल को सही तरीके से संभाला जाता है, उदाहरण के लिए doOnSubscribe () ऑपरेटर का उपयोग करके, आप इसे ग्रेड में जोड़ सकते हैं:

android {
lintOptions {
     disable 'CheckResult'
}}

आईडीई को यह नहीं पता है कि आपकी सदस्यता के संभावित प्रभाव क्या हो सकते हैं जब इसका निपटान नहीं किया जाता है, इसलिए यह इसे संभावित असुरक्षित मानता है। उदाहरण के लिए, आपके Single में एक नेटवर्क कॉल हो सकती है, जो कि आपके निष्पादन के दौरान आपकी Activity को छोड़ देने पर स्मृति रिसाव का कारण बन सकती है।

Disposable एस की एक बड़ी मात्रा का प्रबंधन करने के लिए एक सुविधाजनक तरीका है एक CompositeDisposable का उपयोग करना; बस अपने एन्कोडिंग वर्ग में एक नया कंपोजिटडिजिटल इंस्टेंस वैरिएबल बनाएं, फिर अपने सभी डिस्पोज़ेबल्स को कम्पोजिटडिसोपॉली में जोड़ें (RxKotlin के साथ आप बस अपने सभी addTo(compositeDisposable) जोड़ सकते हैं)। अंत में, जब आप अपने उदाहरण के साथ काम कर रहे हों, तो compositeDisposable.dispose() कॉल करें।

इससे लिंट की चेतावनी से छुटकारा मिल जाएगा, और सुनिश्चित करें कि आपके Disposables को ठीक से प्रबंधित किया जाए।

इस स्थिति में, कोड इस तरह दिखेगा:

CompositeDisposable compositeDisposable = new CompositeDisposable();

Disposable disposable = Single.just(db)
        .subscribeOn(Schedulers.io())
        .subscribe(db -> db.get(1)));

compositeDisposable.add(disposable); //IDE is satisfied that the Disposable is being managed. 
disposable.addTo(compositeDisposable); //Alternatively, use this RxKotlin extension function.


compositeDisposable.dispose(); //Placed wherever we'd like to dispose our Disposables (i.e. in onDestroy()).

जिस क्षण गतिविधि नष्ट हो जाएगी, डिस्पोज़ेबल्स की सूची साफ़ हो जाती है और हम अच्छे हो जाते हैं।

io.reactivex.disposables.CompositeDisposable mDisposable;

    mDisposable = new CompositeDisposable();

    mDisposable.add(
            Single.just(db)
                    .subscribeOn(Schedulers.io())
                    .subscribe(db -> db.get(1)));

    mDisposable.dispose(); // dispose wherever is required

जैसा कि सुझाव दिया गया था कि आप वहां सदस्यता अभियान के परिणाम को जोड़ने के लिए कुछ वैश्विक CompositeDisposable उपयोग कर सकते हैं।

RxJava2Extensions लाइब्रेरी में RxJava2Extensions से पूर्ण रूप से निर्मित डिस्पोजेबल को हटाने के लिए उपयोगी तरीके हैं जब यह पूरा हो जाता है। subscribeAutoDispose अनुभाग देखें

आपके मामले में ऐसा लग सकता है

SingleConsumers.subscribeAutoDispose(
    Single.just(db)
            .subscribeOn(Schedulers.io()),
    composite,
    db -> db.playerDao().getAll())