2323import android .view .View .OnClickListener ;
2424import android .view .ViewGroup ;
2525import android .widget .TextView ;
26- import android .widget .Toast ;
2726
2827import org .simple .eventbus .EventBus ;
2928import org .simple .eventbus .Subcriber ;
3635import java .util .Random ;
3736
3837/**
38+ * <p>
39+ * 该类是演示AndroidEventBus使用的菜单Fragment,演示不了不同参数类型、不同线程模型的事件发布、接收示例.
40+ * 一个事件类型的决定因素只有事件的参数类型( Class ) 和 注册时的tag ( 字符串 ) ,线程模型( mode
41+ * )不会影响事件类型的定位,只会影响订阅函数执行在哪个线程中.
42+ * <p>
43+ * 不同组件 (Activity、Fragment、Service等)、不同线程之间都可以通过事件总线来发布事件,它是线程安全的。
44+ * 只要发布的事件的参数类型和tag都匹配即可接收到事件.
45+ * <p>
46+ * 注意 : 如果发布的事件的参数类型是订阅的事件参数的子类,订阅函数默认也会被执行。例如你在订阅函数中订阅的是List<String>类型的事件,
47+ * 但是在发布时发布的是ArrayList<String>的事件,
48+ * 因此List<String>是一个泛型抽象,而ArrayList<String>才是具体的实现
49+ * ,因此这种情况下订阅函数也会被执行。如果你需要订阅函数能够接收到的事件类型必须严格匹配 ,你可以构造一个EventBusConfig对象,
50+ * 然后设置MatchPolicy然后在使用事件总线之前使用该EventBusConfig来初始化事件总线. <code>
51+ * EventBusConfig config = new EventBusConfig();
52+ config.setMatchPolicy(new StrictMatchPolicy());
53+ EventBus.getDefault().initWithConfig(config);
54+ * </code>
55+ *
3956 * @author mrsimple
4057 */
4158public class MenuFragment extends BaseFragment {
4259
43- public static final String CLICK_TAG = "click_user" ;
60+ static final String CLICK_TAG = "click_user" ;
61+ static final String THREAD_TAG = "sub_thread" ;
62+ public static final String ASYNC_TAG = "async" ;
63+ public static final String REMOVE_TAG = "remove" ;
64+
4465 /**
4566 *
4667 */
@@ -78,15 +99,7 @@ public void onClick(View v) {
7899 @ Override
79100 public void onClick (View v ) {
80101 // 移除用户
81- EventBus .getDefault ().post (new User ("User - 1" ),
82- "remove" );
83-
84- List <User > users = new ArrayList <User >();
85- for (int i = 0 ; i < 5 ; i ++) {
86- users .add (new User ("user - " + i ));
87- }
88-
89- EventBus .getDefault ().post (users , "list" );
102+ EventBus .getDefault ().post (new User ("User - 1" ), REMOVE_TAG );
90103 }
91104 });
92105
@@ -97,67 +110,123 @@ public void onClick(View v) {
97110 @ Override
98111 public void onClick (View v ) {
99112 // 将目标函数执行在异步线程中
100- EventBus .getDefault ().post (new User ("mr.simple-3 " ), "async" );
113+ EventBus .getDefault ().post (new User ("async-user " ), ASYNC_TAG );
101114 }
102115 });
103116
104- startThread ();
117+ // 发布事件,传递的是List数据
118+ rootView .findViewById (R .id .my_post_list_btn ).setOnClickListener (new OnClickListener () {
119+
120+ @ Override
121+ public void onClick (View v ) {
122+ postListData ();
123+ }
124+ });
125+
126+ // 发布事件,调用的是父类中的函数
127+ rootView .findViewById (R .id .my_post_to_supper_btn ).setOnClickListener (new OnClickListener () {
128+
129+ @ Override
130+ public void onClick (View v ) {
131+ postEventToSuper ();
132+ }
133+ });
134+
135+ // 发布事件,将事件投递到子线程中
136+ rootView .findViewById (R .id .my_post_to_thread_btn ).setOnClickListener (new OnClickListener () {
137+
138+ @ Override
139+ public void onClick (View v ) {
140+ // post 给PostThread线程
141+ EventBus .getDefault ().post ("I am MainThread" , THREAD_TAG );
142+ }
143+ });
144+
145+ startThreads ();
105146
106147 EventBus .getDefault ().register (this );
107148 return rootView ;
108149 }
109150
110- private void startThread () {
151+ /**
152+ * start post threads
153+ */
154+ private void startThreads () {
111155 for (int i = 0 ; i < 4 ; i ++) {
112156 threads [i ] = new PostThread (i );
113157 threads [i ].start ();
114158 }
115159 }
116160
117- @ Subcriber (tag = CLICK_TAG )
118- private void updateClickUserName (User clickPerson ) {
119- mUserNameTv .setText (clickPerson .name );
161+ /**
162+ * 发布参数是List<T>类型的事件, 接收函数为@{@see #subcribeList(List)}
163+ */
164+ private void postListData () {
165+ List <User > userLisr = new ArrayList <User >();
166+ for (int i = 0 ; i < 5 ; i ++) {
167+ userLisr .add (new User ("user - " + i ));
168+ }
169+
170+ EventBus .getDefault ().post (userLisr );
120171 }
121172
122- @ Subcriber ( tag = "list" )
173+ @ Subcriber
123174 private void subcribeList (List <User > users ) {
124- Toast .makeText (getActivity (), "list" , Toast .LENGTH_SHORT ).show ();
125175 for (int i = 0 ; i < users .size (); i ++) {
126176 Log .e (getTag (), "### user name = " + users .get (i ));
127177 }
128178 }
129179
130- /*
131- * 模拟从异步线程发来的更新信息
180+ /**
181+ * 订阅点击事件,该事件是从{@see ConstactFragment}中的ListView点击某个项时发布的
182+ *
183+ * @param clickPerson
132184 */
133- @ Subcriber
134- private void updateTime (String name ) {
135- Log .e (getTag (), "### update time, thread = " + Thread .currentThread ().getName ());
185+ @ Subcriber (tag = CLICK_TAG )
186+ private void updateClickUserName (User clickPerson ) {
187+ mUserNameTv .setText (clickPerson .name );
188+ }
136189
190+ /**
191+ * 模拟从异步线程发来的更新信息, {@link PostThread#run()}
192+ */
193+ @ Subcriber
194+ private void receiveFrom (String name ) {
137195 // 从哪个线程投递来的消息
138196 mThreadTv .setText ("from " + name );
139-
140- // post 给TimerThread线程
141- EventBus .getDefault ().post ("I am tom, " , "sayhello" );
142197 }
143198
199+ /**
200+ * 接受参数类型为String的事件,执行在发布事件的线程. {@link PostThread#run()}
201+ *
202+ * @param event
203+ */
144204 @ Subcriber (mode = ThreadMode .POST )
145205 private void invokeInPostThread (String event ) {
146206 Log .e (getTag (), "### invokeInPostThread invoke in thread = "
147207 + Thread .currentThread ().getName ());
148208 }
149209
210+ /**
211+ * 发布一个消息,接收函数在BaseFragment中
212+ */
213+ private void postEventToSuper () {
214+ EventBus .getDefault ().post (new User ("super" ), SUPER_TAG );
215+ }
216+
150217 @ Override
151218 public void onDestroy () {
152- for (PostThread timerThread : threads ) {
153- timerThread .interrupt ();
154- }
219+ // for (PostThread timerThread : threads) {
220+ // timerThread.interrupt();
221+ // }
155222
156223 EventBus .getDefault ().unregister (this );
157224 super .onDestroy ();
158225 }
159226
160227 /**
228+ * 投递线程,不断地给主线程投递消息,同时也接受主线程投递过来的消息
229+ *
161230 * @author mrsimple
162231 */
163232 class PostThread extends Thread {
@@ -167,7 +236,7 @@ class PostThread extends Thread {
167236 public PostThread (int index ) {
168237 mIndex = index ;
169238 setName ("Thread - " + index );
170-
239+ // 线程本身也注册到事件总线中,接收从主线程发布的事件
171240 EventBus .getDefault ().register (this );
172241 }
173242
@@ -176,20 +245,19 @@ public PostThread(int index) {
176245 *
177246 * @param name
178247 */
179- @ Subcriber (tag = "sayhello" )
180- private void hello (String name ) {
248+ @ Subcriber (tag = THREAD_TAG )
249+ private void sayHello (String name ) {
181250 Log .d (getTag (), "### hello, " + name + " --> in " + getName ());
182251 }
183252
184253 @ Override
185254 public void run () {
186- Log .e (getTag (), "### queue : " + EventBus .getDefault ().getEventQueue ().hashCode ()
187- + ", bus = " + EventBus .getDefault ());
188-
189255 while (!this .isInterrupted ()) {
256+ // 从子线程发布消息
190257 EventBus .getDefault ().post (getName ());
258+
191259 try {
192- Thread .sleep (500 * mIndex + 1000 );
260+ Thread .sleep (1000 * mIndex + 3000 );
193261 } catch (InterruptedException e ) {
194262 e .printStackTrace ();
195263 }
0 commit comments