2014-08-29 7 views
10

भर EventBus एक प्रक्रिया (SyncAdapter जो android:process=":sync" मेनिफ़ेस्ट विशेषता है अंदर उदाहरण के लिए) में post घटना के लिए संभव यह है और Otto या EventBus के साथ एक और (अंदर नियमित एप्लिकेशन यूआई) में इसे प्राप्त?ओटो/कई प्रक्रियाओं

मुझे पता है कि Intent और BroadcastReceiver कई प्रक्रियाओं में संचार के लिए ठीक काम करता है लेकिन मैं ओटो/इवेंटबस के साथ सादगी और लचीलापन चाहता हूं।

उत्तर

12

नहीं, यह संभव नहीं है, ओटो, ग्रीनबोट के इवेंटबस, और LocalBroadcastManager सभी इन-प्रोसेस समाधान हैं।

आप मेनिफेस्ट से android:process विशेषता को आसानी से हटाने पर विचार कर सकते हैं, इसलिए यह सब एक प्रक्रिया में चलता है।

+0

लेकिन अगर ऐप बंद हो जाता है तो मैं 'सिंक' कार्यक्षमता खो दूंगा (क्योंकि' सिंक' प्रक्रिया आम साझा की जाती है और पृष्ठभूमि में काम कर रही है)? "विशेषता एंड्रॉइड: निर्यात किया गया =" सत्य "सेवा तक पहुंचने के लिए आपके ऐप (सिस्टम समेत) के अलावा अन्य प्रक्रियाओं की अनुमति देता है। विशेषता एंड्रॉइड: प्रक्रिया =": सिंक "सिस्टम को सिंक नाम की वैश्विक साझा प्रक्रिया में सेवा चलाने के लिए कहती है । " - http://developer.android.com/training/sync-adapters/creating-sync-adapter.html#DeclareSyncAdapterManifest – svenkapudija

+1

@svenkapudija: आपको 'android: process =": ​​सिंक "' का उपयोग करने के लिए ' SyncAdapter'।"क्योंकि: सिंक प्रक्रिया आम साझा की जाती है और पृष्ठभूमि में काम कर रही है" - यह आपके कई घटकों के बीच आम होगा जो 'एंड्रॉइड: प्रक्रिया = ": सिंक" 'का उपयोग करते हैं। [यह डिवाइस पर किसी और चीज़ के साथ आम नहीं होगा] (http://developer.android.com/guide/topics/manifest/service-element.html#proc)। – CommonsWare

+0

यह भी सोचा कि सिंक एडाप्टर पृष्ठभूमि में चलाने के लिए सिंक आवश्यक था। यह पता नहीं है कि यह मामला नहीं है, और इसे हटाकर आप पृष्ठभूमि में सिंक कर सकते हैं जबकि अभी भी यूआई को पता है (ओटो या ब्रॉडकास्ट के माध्यम से) कि कुछ हुआ – Entreco

0

मुझे पता है कि उत्तर पहले ही स्वीकार कर लिया गया था, लेकिन मैंने सोचा कि मैं इस बारे में लिखूंगा कि अगर कोई इस पर चलता है तो समस्या हल हो जाती है और उत्सुकता है कि कोड कैसा दिख सकता है।

यदि आप ओटो का उपयोग कर रहे हैं, तो मैंने मैनिफेस्ट से android:process को हटाकर ऊपर दिए गए स्वीकृत उत्तर का पालन किया। मैंने यहां दिए गए उत्तर का भी पालन किया How to send event from Service to Activity with Otto event bus?, जहां मुख्य थ्रेड पर नहीं चलने के लिए एक बस अपवाद फेंक दिया गया था। इसलिए मैंने दो उत्तरों को जोड़ दिया और उपरोक्त लिंक के अनुसार मुख्य धागे पर निष्पादित करने के लिए एक बस बनाई।

public class MainThreadBus extends Bus { 
    private final Handler mHandler = new Handler(Looper.getMainLooper()); 
    @Override 
    public void post(final Object event) { 
     if (Looper.myLooper() == Looper.getMainLooper()) { 
      super.post(event); 
     } else { 
      mHandler.post(new Runnable() { 
       @Override 
       public void run() { 
        MainThreadBus.super.post(event); 
       } 
      }); 
     } 
    } 
} 

मैं तो एक बस सिंगलटन कि आवेदन में कहीं भी इस्तेमाल कर सकते हैं बनाया:

public final class BusProvider { 
    private static final MainThreadBus BUS = new MainThreadBus(); 

    public static MainThreadBus getInstance() { 
     return BUS; 
    } 

    private BusProvider() { 
    } 
} 

मेरी SyncAdapter में मैं निम्नलिखित कोड घटना, BusProvider.getInstance().post(event); शुरू करने और अपने आवेदन टुकड़ा में मैं बस करने के लिए सदस्यता के लिए इस्तेमाल किया घटना।

यह एप्लिकेशन पूरी तरह से ठीक काम करता था जब एप्लिकेशन अग्रभूमि में था और जब एप्लिकेशन को स्वाइप करने के बाद पृष्ठभूमि में सिंक एडाप्टर शुरू किया गया था।

0

नहीं, लेकिन आप ट्रांजिट का उपयोग कर सकते हैं। उदाहरण के लिए BroadcastReceiver का उपयोग करके: एक प्रक्रिया में, अपने डेटा के साथ broadcast भेजें, फिर BroadcastReceiveronReceive विधियों के इंटीरियर के माध्यम से, एक ओटो ईवेंट पोस्ट करें।

मेरी कोड की तरह

:

public class ReceiveMessageBroadcastReceiver extends BroadcastReceiver { 

    public static final String ACTION_RECEIVE_MESSAGE 
      = "me.drakeet.xxxxxx.ACTION_RECEIVE_MESSAGE"; 
    public static final String AGR_MESSAGE = "AGR_MESSAGE"; 


    // this method can be called in other processes 
    public static void sendBroadcast(Context context, MessageContent content) { 
     Intent intent = new Intent(); 
     intent.setAction(ACTION_RECEIVE_MESSAGE); 
     intent.putExtra(AGR_MESSAGE, content); 
     context.sendBroadcast(intent); 
    } 


    // this method will run in your default process, so you can post otto events to your 
    // default process 
    @Override public void onReceive(Context context, Intent intent) { 
     String action = intent.getAction(); 
     if (action.equals(ACTION_RECEIVE_MESSAGE)) { 
      MessageContent content = intent.getParcelableExtra(AGR_MESSAGE); 
      Otto.getSeat().post(new PlayMessageReceivedEvent(content)); 
     } 
    } 
} 
1

मैं जानता हूँ कि इस सवाल का एक सा पुराना है, लेकिन वहाँ एक पुस्तकालय दावा है कि यह एक घटना-बस/आरएक्स शैली की वास्तुकला के साथ एक क्रॉस-प्रक्रिया संचार संभाल कर सकते हैं प्रतीत हो रहा है ।

https://github.com/edisonw/PennStation

अस्वीकरण: मैं इस प्रयास नहीं किया है, बस इसे मिल गया है और यह क्या यह सवाल पूछ रहा है क्या करने के लिए दावा करता है।

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