2013-01-10 85 views
4

通過使用EventBus,我需要在活動中發佈事件(MyEvent),並在Android中的另一個活動中接收事件。我嘗試了greenrobot EventBus性能測試項目,但無法得到如何去做。Android中的greenrobot EventBus事件事件

試圖ActivitySubscriber

MyEvent event = new MyEvent(); 
EventBus.getDefault().post(event); 

,並試圖接收事件中ActivityReceiver作爲

EventBus.getDefault().register(this); 

public void onEvent(MyEvent event){ 
.... 
} 

,但我無法接受的事件。任何人都可以讓我知道我在哪裏做錯了?

+0

你能在你的問題有點清理格式? – tacaswell

+0

您可能想現在查看本指南:http://greenrobot.org/eventbus/documentation/configuration/sticky-events/ –

回答

22

由於它們是兩項活動,因此ActivitySubscriber過帳事件,而ActivityReceiver仍未創建,或處於失速模式(onStop())。你需要使用粘性事件,即

  • ActivitySubscriber.postSticky(...)

而對於ActivityReceiver你有兩種選擇:

  • EventBus.getDefault().register(this)和地方使用常規EventBus.getDefault().onEvent(...)EventBus.getDefault().getStickyEvent()
  • EventBus.getDefault().registerSticky(),然後

更新: EventBus 3.0改變了訂閱的方式。

無需使用特定後綴而是註釋結束的方法名稱。

如何使用版本3:

//// in your build.gradle 
compile 'de.greenrobot:eventbus:3.0.0-beta1' 
// alternatively you can target latest whatever currently 
// compile 'de.greenrobot:eventbus:+' 

//// from a class which needs to dispatch an event 
// posting an event is as before, no changes 
// here we dispatch a sticky event 
EventBus.getDefault().postSticky(myStickyEvent); 

//// from your class which needs to listen 
// method name can be any name 
// any of subscribe params is optional, i.e. can use just @Subscribe 
@Subscribe(threadMode = ThreadMode.MainThread, sticky = true, priority = 1) 
public void onEventBusEvent(@Nullable final StickyEvent stickyEvent) { 
    if (stickyEvent != null) { 
     ... 
     // optionally you can clean your sticky event in different ways 
     EventBus.getDefault().removeAllStickyEvents(); 
     // EventBus.getDefault().removeStickyEvent(stickyEvent); 
     // EventBus.getDefault().removeStickyEvent(StickyEvent.class); 
    } 
} 

有關詳細信息和第3版比較:

從源頭上提取一些細節:

  • ThreadMode.PostThread

    用戶將在同一個線程,這是發佈事件被調用。這是默認設置。事件傳遞意味着最小的開銷,因爲它避免了完全的線程切換。因此,對於已知完成的簡單任務而言,這是推薦的模式,只需很短的時間而不需要主線程。使用這種模式的事件處理程序必須快速返回以避免阻塞發佈線程,這可能是主線程。

  • ThreadMode.MainThread

    訂戶將在Android的主線程調用(有時被稱爲UI線程)。如果發佈線程是主線程,則將直接調用事件處理程序方法。使用此模式的事件處理程序必須快速返回以避免阻塞主線程。

  • ThreadMode.BackgroundThread

    用戶會在後臺線程調用。如果發佈線程不是主線程,則會在發佈線程中直接調用事件處理程序方法。如果發佈線程是主線程,則EventBus將使用單個後臺線程,該後臺線程將按順序發送所有事件。使用此模式的事件處理程序應儘快返回以避免阻塞後臺線程。

  • ThreadMode.Async

    事件處理方法被調用在一個單獨的線程。這總是獨立於發佈線程和主線程。發佈事件永遠不會等待使用此模式的事件處理程序方法。如果事件處理程序的執行可能需要一些時間,則它應該使用這種模式。用於網絡訪問。避免同時觸發大量長時間運行的異步處理程序方法來限制併發線程的數量。 EventBus使用線程池有效地重用已完成異步事件處理程序通知中的線程。

  • 默認@Subscribe
    • threadMode = ThreadMode.PostThread
    • sticky = false - 如果爲真,提供最新的粘事件(與de.greenrobot.event.EventBus.postSticky(Object)發佈到該用戶(如果事件有)
    • priority = 0 - 用戶優先級來影響事件傳遞的順序,在同一個傳遞線程中,較高優先級的訂閱者會在較低優先級的其他人之前接收事件,de故障優先級爲0.注意:優先級不是會影響具有不同線程模式的訂戶之間的傳送順序。

編輯2

有從LIB的創作者任何Greenrobot EventBus問題,現在一個專門的網站:

http://greenrobot.org/eventbus/

+0

它爲什麼顯示_registerSticky(對象,類,類 ...)類型EventBus被棄用_? –

+2

權的落實,現在是: '@Subscribe(threadMode = ThreadMode.MainThread) 公共無效onEventBusEvent(YourEvent事件){// 'onEventBusEvent' 可以命名爲您希望 }' –

+0

到底什麼.. 。爲什麼不在greenrobots網站上更新文件? –

1

裏面ActivityReceiver類,取代

EventBus.getDefault().register(this); 

EventBus.getDefault().register(this, MyEvent.class); 
+0

它顯示_StatusBus類型的方法registerSticky(對象,類別,類 ...)被棄用_ –

0

它確實取決於何時何地存在此代碼。請記住,您必須先註冊這些事件,然後才能收到它們,並且註冊是在運行時進行的,而不是編譯時間。

因此,您必須確保您已在之後發佈事件您已註冊第二項活動。我只想提上以下行一些斷點,並確保調試器停止在這裏:

EventBus.getDefault().register(this); 

你到這裏之前:

EventBus.getDefault().post(event); 
2
  1. 添加

dependencies { .. compile 'org.greenrobot:eventbus:3.0.0' .. }

轉化爲模塊的依賴關係部分構建gradle

  • 創建的MessageEvent類等
  • public final class MessageEvent { 
     
        private MessageEvent() { 
     
         throw new UnsupportedOperationException("This class is non-instantiable"); 
     
         } 
     
        
     
        public static class Message1{ 
     
         public String str1; 
     
         public Message1(String str) { 
     
          str1 = str; 
     
         } 
     
         } 
     
    
     
        
     
        public static class Message2{ 
     
         public String str2; 
     
         public Message2(final String str) { 
     
          str2 = str; 
     
         } 
     
         } 
     
        } 
     
    
     
    // so on

  • 假設我們有片段1和有假設將消息發送到MainActivity的按鈕
  • public class Fragment1 extends Fragment { 
     
        
     
        private View frView; 
     
        
     
        public void onCreate(Bundle savedInstanceState) { 
     
        super.onCreate(savedInstanceState); 
     
        } 
     
    
     
        @Override 
     
        public View onCreateView(LayoutInflater inflater, ViewGroup 
     
        container, Bundle savedInstanceState) { 
     
        frView = inflater.inflate(R.layout.fragment1, 
     
               container, false); 
     
    
     
        btn = (Button) frView.findViewById(R.id.button); 
     
        btn.setOnClickListener(new View.OnClickListener() { 
     
         
     
        @Override 
     
        public void onClick(View view) { 
     
         frView.setBackgroundColor(Color.RED); 
     
         EventBus.getDefault().post(new MessageEvent.Message1("1st message")); 
     
         EventBus.getDefault().post(new MessageEvent.Message2("2nd message")); 
     
         } 
     
        }); 
     
        return frView; 
     
        }

  • 結束最後MainActivity聽和做動作
  • public class MainActivity extends AppCompatActivity { 
     
    
     
        @Override 
     
        protected void onStart() { 
     
         super.onStart(); 
     
         EventBus.getDefault().register(this); 
     
        } 
     
    
     
        @Override 
     
        protected void onStop() { 
     
         EventBus.getDefault().unregister(this); 
     
         super.onStop(); 
     
        } 
     
    
     
        @Override 
     
        protected void onCreate(Bundle savedInstanceState) { 
     
         super.onCreate(savedInstanceState); 
     
         setContentView(R.layout.activity_main); 
     
    
     
         Fragment1 Fragment1 = new Fragment1(); 
     
         getFragmentManager().beginTransaction().replace(
     
         R.id.activity_main, Fragment1, 
     
         "Fragment 1").commit(); 
     
        } 
     
    
     
    
     
        @Subscribe(threadMode = ThreadMode.MAIN) 
     
        public void onMessage1(MessageEvent.Message1 event) { 
     
         Toast.makeText(getApplication(), event.str1, 
     
             Toast.LENGTH_LONG).show(); 
     
        } 
     
    
     
        @Subscribe(threadMode = ThreadMode.MAIN) 
     
        public void onMessage2(MessageEvent.Message2 event) { 
     
         Toast.makeText(getApplication(), event.str2, 
     
             Toast.LENGTH_LONG).show(); 
     
        } 
     
    }

    相關問題