回答編集履歴

3

コード追加

2021/08/21 19:17

投稿

jimbe
jimbe

スコア13209

test CHANGED
@@ -7,3 +7,169 @@
7
7
 
8
8
 
9
9
  Thread.interrupted() で socket.receive() に割り込みが掛からないのであれば、 socket を close() してしまえば良いのではないでしょうか。(例外が発生するはずです。)
10
+
11
+
12
+
13
+ ----
14
+
15
+
16
+
17
+ 「停止用のダミーパケットを送り着ける」方法で停止させてみました。
18
+
19
+ レイアウトに Button(id=stopButton) があるとしまして、実行後ログに"レシーバの処理を開始" が出たのを確認してからボタンを押すと、"レシーバの処理を中断" が出ると思います。
20
+
21
+ (ダミーパケットの内容はテキトウです。)
22
+
23
+
24
+
25
+ MainActivity.java
26
+
27
+ ```java
28
+
29
+ import androidx.appcompat.app.AppCompatActivity;
30
+
31
+
32
+
33
+ import android.content.Context;
34
+
35
+ import android.os.*;
36
+
37
+ import android.util.Log;
38
+
39
+ import android.widget.Button;
40
+
41
+
42
+
43
+ import java.io.IOException;
44
+
45
+ import java.net.*;
46
+
47
+
48
+
49
+ public class MainActivity extends AppCompatActivity {
50
+
51
+
52
+
53
+ @Override
54
+
55
+ protected void onCreate(Bundle savedInstanceState) {
56
+
57
+ super.onCreate(savedInstanceState);
58
+
59
+ setContentView(R.layout.activity_main);
60
+
61
+
62
+
63
+ ReceiveTask receiveTask = new ReceiveTask(this);
64
+
65
+ receiveTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
66
+
67
+
68
+
69
+ Button button = findViewById(R.id.stopButton);
70
+
71
+ button.setOnClickListener(view -> {
72
+
73
+ receiveTask.cancel(false);
74
+
75
+ new Thread(()->{
76
+
77
+ try(DatagramSocket s = new DatagramSocket();) {
78
+
79
+ DatagramPacket p = new DatagramPacket(new byte[]{0}, 1, InetAddress.getLocalHost(), socket.getLocalPort());
80
+
81
+ s.send(p);
82
+
83
+ } catch(IOException e) {
84
+
85
+ e.printStackTrace();
86
+
87
+ }
88
+
89
+ }).start();
90
+
91
+ });
92
+
93
+ }
94
+
95
+
96
+
97
+ private DatagramSocket socket;
98
+
99
+
100
+
101
+ class ReceiveTask extends AsyncTask<Void, Void, Void> {
102
+
103
+ private boolean running = true;
104
+
105
+
106
+
107
+ ReceiveTask(Context context) {
108
+
109
+ try {
110
+
111
+ socket = new DatagramSocket(33333);
112
+
113
+ } catch(SocketException e) {
114
+
115
+ e.printStackTrace();
116
+
117
+ }
118
+
119
+ }
120
+
121
+
122
+
123
+ @Override
124
+
125
+ protected Void doInBackground(Void... strings) {
126
+
127
+ DatagramPacket receivePacket = new DatagramPacket(new byte[2048], 2048);
128
+
129
+ Log.d("ReceiveTask", "レシーバの処理を開始");
130
+
131
+ while(running) {
132
+
133
+ if (isCancelled()){
134
+
135
+ Log.d("ReceiveTask", "isCancelled:レシーバの処理を中断します");
136
+
137
+ break;
138
+
139
+ }
140
+
141
+ try {
142
+
143
+ socket.receive(receivePacket);
144
+
145
+ } catch (IOException e) {
146
+
147
+ Log.d("ReceiveTask", "受信エラー:" + e);
148
+
149
+ }
150
+
151
+ }
152
+
153
+ Log.d("ReceiveTask", "レシーバの処理を中断");
154
+
155
+ return null;
156
+
157
+ }
158
+
159
+
160
+
161
+ @Override
162
+
163
+ protected void onCancelled() {
164
+
165
+ Log.d("ReceiveTask", "onCancelled:レシーバの処理を中断します");
166
+
167
+ running = false;
168
+
169
+ }
170
+
171
+ }
172
+
173
+ }
174
+
175
+ ```

2

追加

2021/08/21 19:17

投稿

jimbe
jimbe

スコア13209

test CHANGED
@@ -1,5 +1,9 @@
1
- いくらフラグを操作した所で、socket.receive が戻ってこなければ何にもなりません。
1
+ いくらフラグを操作した所で、socket.receive() が戻ってこなければ何にもなりません。
2
2
 
3
3
 
4
4
 
5
5
  cancel(true) とすると, AsyncTask 上で Thread.interrupted() が呼ばれたと思います。
6
+
7
+
8
+
9
+ Thread.interrupted() で socket.receive() に割り込みが掛からないのであれば、 socket を close() してしまえば良いのではないでしょうか。(例外が発生するはずです。)

1

追加

2021/08/20 17:48

投稿

jimbe
jimbe

スコア13209

test CHANGED
@@ -1 +1,5 @@
1
1
  いくらフラグを操作した所で、socket.receive が戻ってこなければ何にもなりません。
2
+
3
+
4
+
5
+ cancel(true) とすると, AsyncTask 上で Thread.interrupted() が呼ばれたと思います。