日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

eventbus多个订阅_番石榴的EventBus –简单的发布者/订阅者

發布時間:2023/12/3 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 eventbus多个订阅_番石榴的EventBus –简单的发布者/订阅者 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

eventbus多個訂閱

在查看Google的Guava庫版本10的最新添加內容時,我注意到EventBus的添加。 這是發布-訂閱樣式消息傳遞系統的輕量級實現。 這類似于JMS提供的發布-訂閱模型,但是消息保留在應用程序內,而不是在外部廣播。

EventBus允許您在程序中創建對象可以訂閱的流; 然后,他們將接收發布到這些流的消息。 盡管使用諸如單例之類的模式來重新創建對象間通信并不是特別困難,但EventBus確實提供了一種特別簡單且輕巧的機制。 單例還使具有單一類型的多個事件總線更加困難,并且

很難測試。

作為示例,我將使用幾個人將通過telnet連接到的套接字創建一個簡單的多用戶聊天程序。 我們將簡單地創建一個EventBus作為通道。 用戶發送到系統的任何消息都將發布給所有其他用戶。

所以這是我們的UserThread對象:

class UserThread extends Thread {private Socket connection;private EventBus channel;private BufferedReader in;private PrintWriter out;public UserThread(Socket connection, EventBus channel) {this.connection = connection;this.channel = channel;try {in = new BufferedReader(new InputStreamReader(connection.getInputStream()));out = new PrintWriter(connection.getOutputStream(), true);} catch (IOException e) {e.printStackTrace();System.exit(1);}}@Subscribepublic void recieveMessage(String message) {if (out != null) {out.println(message);}}@Overridepublic void run() {try {String input;while ((input = in.readLine()) != null) {channel.post(input);}} catch (IOException e) {e.printStackTrace();}//reached eofchannel.unregister(this)try {connection.close();} catch (IOException e) {e.printStackTrace();}in = null;out = null;} }

可以看出,這只是一個簡單的線程對象,其中包含充當通道的EventBus和用戶的Socket。 然后,run方法通過調用EventBus上的post方法,簡單地讀取套接字并將消息發送到通道。

然后通過添加帶有@Subscribe批注的公共方法來實現接收消息(請參見上文)。 當收到方法參數中給定類型的消息時,這會通知EventBus調用此方法。 我在這里發送字符串,但是可以使用其他對象。

GOTCHA :用@Subscribe注釋的方法必須是公共的。

接收功能接收消息并將其寫出到用戶的連接中。 當然,這還將回送已發送給原始用戶的消息,因為UserThread對象本身將接收其發布的消息。

剩下的就是創建一個簡單的服務器對象,該對象偵聽連接并根據需要創建UserThread對象。

public class EventBusChat {public static void main(String[] args) {EventBus channel = new EventBus();ServerSocket socket;try {socket = new ServerSocket(4444);while (true) {Socket connection = socket.accept();UserThread newUser = new UserThread(connection, channel);channel.register(newUser);newUser.start();}} catch (IOException e) {e.printStackTrace();}} }

如圖所示,這將創建通道,接受用戶連接并將其注冊到EventBus。 這里要注意的重要代碼是使用UserThread對象作為參數調用register方法。 該調用在EventBus上預訂對象,并指示它可以處理消息。

服務器啟動后,用戶便可以使用telnet命令連接到聊天服務器:

telnet 127.0.0.1 4444

而且,如果您連接多個實例,您將看到發送的所有消息都被中繼到其他實例。

看完此示例后,您可能想知道EventBus有什么用。 一個很好的例子是在用戶界面和后端代碼之間保持非常松散的耦合。 用戶輸入將生成一條消息,例如調整大小,失去焦點或關閉。 然后,后端組件可以簡單地訂閱這些事件并適當地處理它們。 官方文檔還列出了許多其他用途。

注意: EventBus并非用于通用的發布者-訂閱者通信,這只是API交互方式的一個示例。

原文: http : //insightfullogic.com/blog/2011/oct/10/eventbus/

參考: Guava的EventBus –來自我們LCG博客Java用戶組的 JCG合作伙伴 Andriy Andrunevchyn的簡單發布者/訂閱者 。

翻譯自: https://www.javacodegeeks.com/2013/06/guavas-eventbus-simple-publishersubscriber.html

eventbus多個訂閱

總結

以上是生活随笔為你收集整理的eventbus多个订阅_番石榴的EventBus –简单的发布者/订阅者的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。