callback - आरएक्स जावा एंड्रॉइड: ऑब्ज़र्वर को इस कॉलबैक ब्लॉक को कन्वर्ट कैसे करें




rx-java rx-android (2)

यह आम तौर पर एसिंक / कॉलबैक वर्कडी के बीच रिएक्टिव में पुल करने के लिए सही दृष्टिकोण है, लेकिन Observable.create() का उपयोग अब निराश हो गया है, क्योंकि इसे सही बनाने के लिए उन्नत ज्ञान की आवश्यकता होती है।
आपको हाल ही में बनाई गई विधि का प्रयोग करना चाहिए Observable.fromEmitter() , जो काफी समान दिखाई देगा:

    return Observable.fromEmitter(new Action1<Emitter<Integer>>() {
        @Override
        public void call(Emitter<Integer> emitter) {

            transObs.setTransferListener(new TransferListener() {
                @Override
                public void onStateChanged(int id, TransferState state) {
                    if (state == TransferState.COMPLETED)
                        emitter.onCompleted();
                }

                @Override
                public void onProgressChanged(int id, long bytesCurrent, long bytesTotal) {

                }

                @Override
                public void onError(int id, Exception ex) {
                    emitter.onError(ex);
                }
            });
            emitter.setCancellation(new Cancellable() {
                @Override
                public void cancel() throws Exception {
                    // Deal with unsubscription:
                    // 1. unregister the listener to avoid memory leak
                    // 2. cancel the upload 
                }
            });
        }
    }, Emitter.BackpressureMode.DROP);

यहां क्या जोड़ा गया है: अनिच्छा से निपटना: अपलोड रद्द करना, और स्मृति लीक से बचने के लिए अपंजीकृत करना, और बैकवर्डयर रणनीति को निर्दिष्ट करना
आप यहां अधिक पढ़ सकते हैं

अतिरिक्त नोट्स:

  • यदि आप प्रगति के साथ रुचि रखते हैं तो आप प्रगति के साथ प्रगति के साथ अगले () पर कॉल कर सकते हैं प्रगतिशील onProgressChanged() और अवलोकन के लिए Observable<Integer> परिवर्तित करें
  • यदि नहीं, तो आप onNext() का उपयोग करने पर विचार करना चाह सकते हैं, जो onNext() नहीं है onNext() उत्सर्जन के साथ नहीं बल्कि केवल onCompleted() यह आपके मामले को सूट कर सकता है यदि आपकी प्रगति संकेतों में दिलचस्पी नहीं है।

मैं अमेज़ॅन के एस 3 एंड्रॉइड एसडीके के माध्यम से एक फाइल अपलोड करने की कोशिश कर रहा हूं। मैंने RX Java का थोड़ा सा प्रयोग किया है लेकिन मुझे यकीन नहीं है कि इस पद्धति को एक विधि में बदलने के लिए जो अवलोकन करता है, क्योंकि मैं इस पद्धति का परिणाम दूसरे अवलोकन के कॉल के साथ श्रृंखला में करना चाहता हूं। यह मुझे भ्रमित करता है मुझे लगता है कि इस तथ्य की वजह से लगता है कि यह तुरंत वापस नहीं लौटाता है और जब तक ओनर या ओनस्टेट परिवर्तन नहीं हो जाता है मैं इन स्थितियों को एक आरएक्स तरीके से कैसे प्रबंधित कर सकता हूं?

public void uploadFile(TransferObserver transferObserver){

    transferObserver.setTransferListener(new TransferListener() {
        @Override
        public void onStateChanged(int id, TransferState state) {

        }

        @Override
        public void onProgressChanged(int id, long bytesCurrent, long bytesTotal) {

        }

        @Override
        public void onError(int id, Exception ex) {

        }
  });

}

अगर कोई आरएक्स जावा 2 और लम्म्दास के साथ जवाब दे सकता है जो महान होगा क्योंकि मैं इस पर थोड़ी देर तक आ रहा हूं


@ योशीज़, मैं आपका कोड संकलित नहीं कर सका, लेकिन आपने मुझे बहुत मदद की है, इसलिए आपके उत्तर के आधार पर यह अब मेरे पास है:

return Observable.fromEmitter(new Action1<AsyncEmitter<Integer>>() {
            @Override
            public void call(AsyncEmitter<Integer> emitter) {

                transObs.setTransferListener(new TransferListener() {
                    @Override
                    public void onStateChanged(int id, TransferState state) {
                        if (state == TransferState.COMPLETED)
                            emitter.onCompleted();
                    }

                    @Override
                    public void onProgressChanged(int id, long bytesCurrent, long bytesTotal) {

                    }

                    @Override
                    public void onError(int id, Exception ex) {
                        emitter.onError(ex);
                    }
                });

                emitter.setCancellation(new AsyncEmitter.Cancellable() {
                    @Override
                    public void cancel() throws Exception {

                        transObs.cleanTransferListener();
                    }
                });
            }
        }, AsyncEmitter.BackpressureMode.DROP);