1
+ package tool .async2sync .activity ;
2
+
3
+ import android .app .Activity ;
4
+ import android .os .Bundle ;
5
+ import android .os .Handler ;
6
+ import android .os .Looper ;
7
+ import android .text .TextUtils ;
8
+ import android .view .View ;
9
+ import android .widget .Button ;
10
+ import android .widget .TextView ;
11
+ import android .widget .Toast ;
12
+
13
+ import tool .async2sync .app .R ;
14
+ import tools .android .async2sync .Connection ;
15
+ import tools .android .async2sync .Packet ;
16
+ import tools .android .async2sync .PacketCollector ;
17
+ import tools .android .async2sync .PacketFilter ;
18
+ import tools .android .async2sync .RandomIdGenerator ;
19
+
20
+ public class MainActivity extends Activity {
21
+
22
+ Connection mConnection = new Connection (5000L ); // 设定5秒无结果超时
23
+
24
+ @ Override
25
+ protected void onCreate (Bundle savedInstanceState ) {
26
+ super .onCreate (savedInstanceState );
27
+ setContentView (R .layout .activity_main );
28
+
29
+ final Button btn1 = (Button ) findViewById (R .id .btn1 );
30
+ final TextView btn1ret = (TextView ) findViewById (R .id .btn1_ret );
31
+ final Button btn2 = (Button ) findViewById (R .id .btn2 );
32
+ final TextView btn2ret = (TextView ) findViewById (R .id .btn2_ret );
33
+
34
+ btn1 .setOnClickListener (new View .OnClickListener () {
35
+ @ Override
36
+ public void onClick (final View view ) {
37
+ final long start = System .currentTimeMillis ();
38
+ Payload payload = new Payload ();
39
+ payload .title = "start@" + start ;
40
+ asyncTestFunction (payload , new PayloadResult () {
41
+ @ Override
42
+ public void onResult (final Payload payload ) {
43
+ // 异步处理后,获得结果,在UI线程刷新控件
44
+ new Handler (Looper .getMainLooper ()).post (new Runnable () {
45
+ @ Override
46
+ public void run () {
47
+ String msg = payload .title ;
48
+ Toast .makeText (view .getContext (), msg , Toast .LENGTH_LONG ).show ();
49
+ btn1ret .setText (msg );
50
+ }
51
+ });
52
+ }
53
+ });
54
+ }
55
+ });
56
+
57
+ btn2 .setOnClickListener (new View .OnClickListener () {
58
+ @ Override
59
+ public void onClick (final View view ) {
60
+ final long start = System .currentTimeMillis ();
61
+ String packetId = RandomIdGenerator .randomId (3 );
62
+ Payload payload = new Payload ();
63
+ payload .identify = packetId ;
64
+ payload .title = "start@" + start ;
65
+ // sendPacket启动异步任务,然后线程一直等,一直等到nextResult获取结果(或超时)
66
+ PacketFilter filter = new PacketIDFilter (payload .identify );
67
+ PacketCollector collector = mConnection .createPacketCollector (filter );
68
+ sendPacket (payload );
69
+ final Packet <Payload > packet = collector .nextResult (mConnection .getConnectionTimeOut ());
70
+ collector .cancel ();
71
+ // 由于一直运行在主线程,这里直接刷新处理
72
+ // 界面上按钮会卡住,这只是为了说明同步线程执行,方便演示,实际使用不建议
73
+ if (packet != null && packet .getContent () != null ) {
74
+ Payload resulPayload = packet .getContent ();
75
+ String msg = resulPayload .title ;
76
+ Toast .makeText (view .getContext (), msg , Toast .LENGTH_LONG ).show ();
77
+ btn2ret .setText (msg );
78
+ }
79
+ }
80
+ });
81
+ }
82
+
83
+ public interface PayloadResult {
84
+ void onResult (Payload payload );
85
+ }
86
+
87
+ public void asyncTestFunction (final Payload payload , final PayloadResult callback ) {
88
+ // 模拟一个异步任务,通过输入,异步处理,返回处理后的结果
89
+ new Thread (new Runnable () {
90
+ @ Override
91
+ public void run () {
92
+ try {
93
+ Thread .sleep (2000L );
94
+ } catch (Exception e ) {
95
+ e .printStackTrace ();
96
+ }
97
+ payload .title += "|end@" + System .currentTimeMillis ();
98
+ if (callback != null ) {
99
+ callback .onResult (payload );
100
+ }
101
+ }
102
+ }).start ();
103
+ }
104
+
105
+ public class Payload {
106
+ public String identify ;
107
+ public String title ;
108
+ }
109
+
110
+ class PacketIDFilter implements PacketFilter {
111
+
112
+ String packetId ;
113
+
114
+ public PacketIDFilter (String packetId ) {
115
+ this .packetId = packetId ;
116
+ }
117
+
118
+ @ Override
119
+ public boolean accept (Packet packet ) {
120
+ if (packet == null ) {
121
+ return false ;
122
+ }
123
+ if (!(packet .getContent () instanceof Payload )) {
124
+ return false ;
125
+ }
126
+ Payload payloadContent = (Payload ) packet .getContent ();
127
+ if (TextUtils .isEmpty (payloadContent .identify )) {
128
+ return false ;
129
+ }
130
+ return payloadContent .identify .equals (this .packetId );
131
+ }
132
+ }
133
+
134
+ public void sendPacket (Payload payload ) {
135
+ asyncTestFunction (payload , new PayloadResult () {
136
+ @ Override
137
+ public void onResult (Payload payload ) {
138
+ Packet <Payload > newPacket = new Packet <Payload >();
139
+ newPacket .setContent (payload );
140
+ mConnection .processPacket (newPacket );
141
+ }
142
+ });
143
+ }
144
+ }
0 commit comments