UDPのパケットを受信するため,AsyncTaskでループ処理を実行しています.
メインアクティビティが閉じられたときに,onPause()メソッド内から非同期タスク終了するように要求したいのですが,タスクが終了しません.
呼び出しの仕方が誤っているのでしょうか.
試したこと
参考記事の最後の回答が,自分と同じ状況だと思い,見よう見まねで書いてみたのですが,上手くいきませんでした.
また,参考にした回答で,receiveTask.requestTermination();の処理が実装できなかったのでここに問題があるのでしょうか?
さらに,
cancelの「mayInterruptIfRunning boolean:」真偽値の意味がいまいち分かりません.
公式より→ 「このタスクを実行しているスレッドを中断する必要がある場合はtrue。それ以外の場合は、進行中のタスクを完了できます。」
このタスクを実行しているスレッドとは,非同期処理のスレッドでしょうか.
protected void onCreate(Bundle savedInstanceState) { receiveTask = new ReceiveTask(this); receiveTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } // リスナー解放 レシーバを中断する処理は,onClick() protected void onPause() { super.onPause(); getMembers = false; Log.d("onPause()", "位置情報と方角取得リスナをリリース"); mSensorManager.unregisterListener(this); //stop location updates when Activity is no longer active if (fusedLocationClient != null) { fusedLocationClient.removeLocationUpdates(mLocationCallback); } } @Override public void onClick(View v) { if (R.id.exitGroup == v.getId()) { receiveTask.cancel(false); /***********追記**************************************************/ UtilCommon utilCommon = (UtilCommon) UtilCommon.getAppContext(); DatagramSocket socket = utilCommon.getDatagramSocket(); /*****************************************************************/ new Thread(()->{ try(DatagramSocket s = new DatagramSocket();) { // 宛先ポートが「s.getLocalPort()」としていた DatagramPacket p = new DatagramPacket(new byte[]{0}, 1, InetAddress.getLocalHost(), socket.getLocalPort()); s.send(p); Log.d("onClick()", "ダミーパケット送信"); } catch(IOException e) { e.printStackTrace(); } }).start(); exitAndCloseProcess(); finish(); } else if (R.id.send == v.getId()) { //... } else if (R.id.mute == v.getId()) { //... } }
public class ReceiveTask extends AsyncTask<Void, Void, Void> { private boolean running = true; // ... @Override protected Void doInBackground(Void... strings) { Log.d("ReceiveTask", "レシーバの処理を開始"); DatagramPacket receivePacket = new DatagramPacket(new byte[2048], 2048); UtilCommon utilCommon = (UtilCommon) UtilCommon.getAppContext(); DatagramSocket socket = utilCommon.getDatagramSocket(); while(running) { if (isCancelled()){ Log.d("ReceiveTask", "isCancelled:レシーバの処理を中断します"); break; } try { socket.receive(receivePacket); // } catch (IOException e) { Log.d("ReceiveTask", "受信エラー:" + e); } String receivedResult = new String(receivePacket.getData(), 0, receivePacket.getLength()); try { // ↓のコードで Warning JSONObject jsonObject = new JSONObject(receivedResult); //受け取ったデータを基に処理 //... } catch (JSONException e) { e.printStackTrace(); Log.d("Receiver(シグナリングとPeer)", "エラー:" + e); } } return null; } @Override protected void onCancelled() { Log.d("ReceiveTask", "onCancelled:レシーバの処理を中断します"); running = false; } }
発生している警告
ReceiveTask.java:70がJSONObject jsonObject = new JSONObject(receivedResult); です.
この警告は,無視して問題ないでしょうか。
D/onClick(): ダミーパケット送信 W/System.err: org.json.JSONException: Value �� of type java.lang.String cannot be converted to JSONObject W/System.err: at org.json.JSON.typeMismatch(JSON.java:111) at org.json.JSONObject.<init>(JSONObject.java:163) at org.json.JSONObject.<init>(JSONObject.java:176) at com.example.g_lockonbyaw.signaling.receiver.ReceiveTask.doInBackground(ReceiveTask.java:70) at com.example.g_lockonbyaw.signaling.receiver.ReceiveTask.doInBackground(ReceiveTask.java:27) at android.os.AsyncTask$2.call(AsyncTask.java:333) at java.util.concurrent.FutureTask.run(FutureTask.java:266) W/System.err: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636) at java.lang.Thread.run(Thread.java:764) D/Receiver(シグナリングとPeer): エラー:org.json.JSONException: Value �� of type java.lang.String cannot be converted to JSONObject D/ReceiveTask: isCancelled:レシーバの処理を中断します D/ReceiveTask: onCancelled:レシーバの処理を中断します
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/08/21 13:49
2021/08/21 13:59
2021/08/21 14:52
2021/08/21 15:49
2021/08/22 16:31 編集
2021/08/21 17:08
2021/08/21 17:20 編集
2021/08/21 17:32
2021/08/22 09:06
2021/08/22 09:17
2021/08/22 12:50
2021/08/22 12:55
2021/08/22 15:51
2021/08/22 16:55 編集
2021/08/22 16:19 編集
2021/08/22 16:48
2021/08/22 17:24 編集
2021/08/22 18:14
2021/08/23 05:01
2021/08/23 07:24
2021/08/23 12:21