Skip to content

Commit 53a8afb

Browse files
mrsimplemrsimple
authored andcommitted
fixed bug
1 parent 297f65a commit 53a8afb

File tree

10 files changed

+168
-62
lines changed

10 files changed

+168
-62
lines changed

Simple_Event_Test/src/org/simple/eventbus/test/EventTypeTest.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,4 +82,9 @@ public void testDiffParamKeysInMap() {
8282

8383
assertEquals(6, map.size());
8484
}
85+
86+
public void testEquals() {
87+
assertEquals(new EventType(String.class, "tag"), new EventType(String.class, "tag"));
88+
assertFalse( new EventType(String.class, "tag").equals(new EventType(String.class, "s_tag")));
89+
}
8590
}

Simple_eventbus_demo/res/layout/menu_fragment.xml

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,30 @@
2323
android:layout_height="wrap_content"
2424
android:text="@string/post_async" />
2525

26+
<Button
27+
android:id="@+id/my_post_to_supper_btn"
28+
android:layout_width="match_parent"
29+
android:layout_height="wrap_content"
30+
android:text="@string/post_supper" />
31+
32+
<Button
33+
android:id="@+id/my_post_list_btn"
34+
android:layout_width="match_parent"
35+
android:layout_height="wrap_content"
36+
android:text="@string/post_list" />
37+
38+
<Button
39+
android:id="@+id/my_post_to_thread_btn"
40+
android:layout_width="match_parent"
41+
android:layout_height="wrap_content"
42+
android:text="@string/post_to_thread" />
43+
2644
<TextView
2745
android:id="@+id/click_tv"
2846
android:layout_width="match_parent"
2947
android:layout_height="wrap_content"
30-
android:layout_marginTop="20dp" />
48+
android:layout_marginTop="20dp"
49+
android:text="@string/user_click_hint" />
3150

3251
<TextView
3352
android:id="@+id/timer_tv"

Simple_eventbus_demo/res/values/strings.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@
44
<string name="remove_user">remove</string>
55
<string name="add_user">add</string>
66
<string name="post_async">async</string>
7+
<string name="post_supper">post to supper</string>
8+
<string name="post_list">post list data</string>
9+
<string name="user_click_hint">no one click</string>
10+
<string name="post_to_thread">post to thread</string>
711
<string name="execute_async">this execute async, thread = </string>
812

913
</resources>

Simple_eventbus_demo/src/org/simple/eventbus/demo/fragment/BaseFragment.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,9 @@
3535
*/
3636
public class BaseFragment extends Fragment {
3737

38-
@Subcriber
39-
private void protectedMethodInSuper(User user) {
40-
Log.e(getTag(), "### supper protected Method In Super invoked ( default tag )");
41-
}
38+
static final String SUPER_TAG = "super_tag";
4239

43-
@Subcriber
40+
@Subcriber(tag = SUPER_TAG)
4441
private void privateMethodInSuper(User user) {
4542
Log.e(getTag(), "### supper private Method In Super invoked ( default tag ) ");
4643
}

Simple_eventbus_demo/src/org/simple/eventbus/demo/fragment/ConstactFragment.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package org.simple.eventbus.demo.fragment;
1818

1919
import android.os.Bundle;
20+
import android.support.v4.app.Fragment;
2021
import android.view.LayoutInflater;
2122
import android.view.View;
2223
import android.view.ViewGroup;
@@ -39,7 +40,7 @@
3940
/**
4041
* @author mrsimple
4142
*/
42-
public class ConstactFragment extends BaseFragment {
43+
public class ConstactFragment extends Fragment {
4344

4445
BaseAdapter mAdapter;
4546
List<User> mConstacts = new LinkedList<User>();
@@ -97,8 +98,8 @@ public void addPerson(User person) {
9798
*
9899
* @param person
99100
*/
100-
@Subcriber(tag = "remove")
101-
private void addPersonPrivate(User person) {
101+
@Subcriber(tag = MenuFragment.REMOVE_TAG)
102+
private void removePersonPrivate(User person) {
102103
mConstacts.remove(person);
103104
mAdapter.notifyDataSetChanged();
104105
}
@@ -108,7 +109,7 @@ private void addPersonPrivate(User person) {
108109
*
109110
* @param event
110111
*/
111-
@Subcriber(tag = "async", mode = ThreadMode.ASYNC)
112+
@Subcriber(tag = MenuFragment.ASYNC_TAG, mode = ThreadMode.ASYNC)
112113
private void asyncMethod(final User person) {
113114
try {
114115
final String threadName = Thread.currentThread().getName();

Simple_eventbus_demo/src/org/simple/eventbus/demo/fragment/MenuFragment.java

Lines changed: 105 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
import android.view.View.OnClickListener;
2424
import android.view.ViewGroup;
2525
import android.widget.TextView;
26-
import android.widget.Toast;
2726

2827
import org.simple.eventbus.EventBus;
2928
import org.simple.eventbus.Subcriber;
@@ -36,11 +35,33 @@
3635
import 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
*/
4158
public 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

Comments
 (0)