2017-06-13 7 views
9

हम दूरस्थ सेवाओं और हमारे यूआई के बीच राज्य परिवर्तनों को संवाद करने के लिए प्रसारण का उपयोग करते हैं। ऐसा करने से, हमने एक बहुत ही अजीब व्यवहार की खोज की: कभी-कभी (मुझे कोई संकेत नहीं मिल रहा है क्यों) इन प्रसारणों में लगभग 8 के दशक में देरी हो रही है।ब्रॉडकास्ट में देरी

हम उन्हें कैसे भेजने के लिए (बहुत बुनियादी, mState सिर्फ एक enum है) (सेवा में रिमोट प्रक्रिया):

Intent intent = new Intent(); 
intent.setAction(ACTION_STATE_CHANGED); 
intent.putExtra(EXTRA_STATE, mState); 

Service.get().sendBroadcast(intent, null); 

कैसे स्थिर रिसीवर पंजीकृत है (एप्लिकेशन):

<receiver android:name=".ServiceStateReceiver"> 
    <intent-filter> 
     <action android:name="service.intent.action.STATE_CHANGE" /> 
    </intent-filter> 
</receiver> 

रिसीवर क्लास (ऐप):

public class ServiceStateReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     Log.v("State", "State via static received"); 
    } 
} 

अब कभी-कभी देरी होती है (हमेशा एक ही राज्य के लिए)

राज्य enum:

public enum State { 
    DISCONNECTED, 
    BT_DISABLED, 
    BT_SCANNING, 
    BT_TIMEOUT, 
    BT_FAILURE, 
    BT_LOCATION_NEEDED, 
    CONNECTING, 
    ACTIVATION_FAILURE, 
    VIN_NEEDED, 
    CAR_MODEL_NEEDED, 
    MILEAGE_NEEDED, 
    READY, 
    IGNITION_OFF, 
    IGNITION_ON; 

    @Override 
    public String toString() { 
     return name(); 
    } 
} 

अब अजीब हिस्सा आता है: मैं एक गतिशील रिसीवर रजिस्टर अगर हम हमेशा तुरंत वहाँ सभी प्रसारण प्राप्त। स्थिर व्यक्ति में अभी भी बड़ी देरी है। अगर मैं sendOrderedBroadcast दोनों के माध्यम से प्रसारण भेजता हूं (स्थिर & गतिशील) इस देरी में है।

गतिशील रिसीवर:

registerReceiver(new BroadcastReceiver() { 
      @Override 
      public void onReceive(Context context, Intent intent) { 
       Log.i("State", "State via dynamic received"); 
      } 
     }, new IntentFilter(State.ACTION_STATE_CHANGED)); 

क्या मैं अब तक की कोशिश की:

  • मुख्य थ्रेड से/एक कार्यकर्ता धागा (कुछ भी नहीं बदला) प्रसारण भेजें
  • अनुमति विशेषता के साथ खेला (कुछ भी नहीं बदला)
  • एक पंक्ति में कई बार प्रसारण भेजता है (कुछ भी नहीं बदल रहा है, बस कई देरी वाले प्रसारण प्राप्त कर रहा है)

इसके अलावा: लॉगकट से कोई आउटपुट जो संबंधित प्रतीत होता है। विभिन्न उपकरणों (OnePlus 3 7.1.1, जेड 3 6.0.1, S7 एज 7.1.1) पर की कोशिश की, सभी एक ही व्यवहार

मुझे लगता है कि यह संबंधित हो सकता है दिखाने: Android network state change detection takes time

+1

वहाँ भी इसके लिए एंड्रॉयड समस्या ट्रैकर में एक मुद्दा है: https://issuetracker.google.com/issues/62298626 – noongiya95

उत्तर

2

के लिए एक जवाब के लिए खोज करने के बाद घंटे, मुझे मिला? इसे पोस्ट करने के बाद समाधान।

ऐसा लगता है कि इस विलंब को FLAG_RECEIVER_FOREGROUND ध्वज जोड़ना पूरी तरह से इस देरी को हटा देता है। यह जानना अभी भी अच्छा होगा कि ऐसा क्यों होता है और यदि यह एक अच्छा "ठीक" है या यदि मैं इसके साथ कुछ और नष्ट करता हूं।

यह काम कर देता है:

intent.setFlags(FLAG_RECEIVER_FOREGROUND); 

तो सेट, जब एक प्रसारण प्राप्तकर्ता अग्रभूमि प्राथमिकता पर चलाने के लिए संक्षिप्त टाइमआउट अंतराल के साथ अनुमति दी है भेजने। सामान्य प्रसारण के दौरान रिसीवर स्वचालित रूप से पृष्ठभूमि प्राथमिकता वर्ग से बाहर नहीं हो जाते हैं।

स्रोत: https://developer.android.com/reference/android/content/Intent.html#FLAG_RECEIVER_FOREGROUND

संबंधित मुद्दे