2016-01-19 3 views
6

पर डिबगिंग करते समय RxJava कैश थ्रेड में इंटरप्टेड अपवाद, कभी-कभी जब मैं अपने ऐप को डिबग कर रहा हूं, तो मुझे RxCachedThreadScheduler-1 में इंटरप्टेड एक्सेप्शन का सामना करना पड़ता है। एंड्रॉइड

Fatal Exception: java.lang.InterruptedException 
     at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.reportInterruptAfterWait(AbstractQueuedSynchronizer.java:1991) 
     at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2025) 
     at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1048) 
     at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:776) 
     at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1035) 

मैं जिसमें मैं इस तरह मेरी नमूदार की सदस्यता एक कस्टम दृश्य है:

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

    sub = FollowHandler.getInstance().getObservable() 
      .filter(new Func1<FollowEvent, Boolean>() { 
       @Override 
       public Boolean call(FollowEvent followEvent) { 
        if(followEvent == null || followEvent.user == null 
          || user == null) 
         return false; 

        return followEvent.user.id == user.id; 
       } 
      }) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(new Observer<FollowEvent>() { 
       @Override 
       public void onCompleted() {} 

       @Override 
       public void onError(Throwable e) {} 

       @Override 
       public void onNext(FollowEvent followEvent) { 
        reactToThisNiceEvent(followEvent); 
       } 
      }); 
} 

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

    if(sub != null) 
     sub.unsubscribe(); 
} 

यहाँ नमूदार है: यहाँ का पता लगाने है, जिसमें

eventSubject.asObservable() 
     .observeOn(Schedulers.io()) 
     .doOnNext(new Action1<FollowEvent>() { 
      @Override 
      public void call(FollowEvent followEvent) { 
       if(followEvent != null) 
        doSomethingNice(followEvent); 
      } 
     }) 
     .share(); 

eventSubject एक है सरल PublishSubject। मैं RxJava 1.1.0 के साथ RxAndroid 1.1.0 का उपयोग कर रहा हूं।

क्या किसी को पता है कि यह क्यों हो रहा है?

उत्तर

0

मैं क्यों ऐसा होता है, यकीन नहीं है, लेकिन यह करने के लिए प्रयास करें:

sub = FollowHandler.getInstance().getObservable() 
      .filter(...) 
      .subscribeOn(Schedulers.io()) // <<<<<<<<<< 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(...); 

इसके अलावा, मुझे लगता है कि आप share() की जरूरत नहीं है:

eventSubject.asObservable() 
     .doOnNext(...) 
     .subscribeOn(Schedulers.io()) // <<<<< subscribeOn instead of observeOn, but actually, you don't need it here... 
     .share();  // <<<<< remove it 

मैं eventbus रूप Subject का उपयोग जैसा कि मैंने ऊपर वर्णित किया है। और मुझे ऐसा कोई समस्या नहीं थी।

पीएस onDetachedFromWindow() में बेहतर होगा यदि आप चेक सदस्यता सदस्यता लेंगे या नहीं। मुझे पता है कि इस विधि मुख्य थ्रेड में कहा जाता है, और समवर्ती पहुँच इस Subscription करने के लिए असंभव है, लेकिन मुझे लगता है कि यह अच्छा शैली है:

if(sub != null && !sub.isUnsubscribed()) 
     sub.unsubscribe(); 
+0

जवाब के लिए धन्यवाद। जैसा कि आपने सुझाव दिया है, मैं सब्सक्राइब करने की कोशिश करता हूं और देखता हूं। हालांकि मुझे इसका परीक्षण करने में कुछ समय लग सकता है। शेयर के बारे में, मुझे इसकी आवश्यकता है। चूंकि शेयर से पहले किए गए कार्यों को सभी ग्राहकों के बीच साझा किया जाना चाहिए (और परिणाम सभी ग्राहकों के लिए समान है)। अगर मैं शेयर हटा देता हूं, तो डॉनऑनक्स्ट को सभी ग्राहकों के लिए बुलाया जाएगा (जो व्यर्थ है)। और सदस्यता के लिए धन्यवाद सदस्यता() चेक। मैं पूरी तरह से याद किया। – Avsector