前提・実現したいこと
Android Studioを使用して、AndroidからPCへ以下の条件に沿った出力値をUDP通信で連続して出力するシステムを作成したいです。
・Button1が1度押下された場合、「A」が出力され、この値は0.1秒間保持される
・Button2が1度押下された場合、「B」が出力され、この値は0.1秒間保持される
・Button3が1度押下された場合、「C」が出力され、この値は0.1秒間保持される
・Buttonが押下されていない場合、「1」が出力され続ける
現状のプログラムとして
・アプリケーションが起動したときに、「1」が出力
・Button1が1度押下された場合、「A」が出力
・Button2が1度押下された場合、「B」が出力
・Button3が1度押下された場合、「C」が出力
までUDP通信で出力値を送信することができましたが、連続で出力する方法や出力値を保持する方法が分からず困っております。
※出力値はUdpIpToolで見ています。
該当のソースコード
MainActivity
Java
1public class MainActivity extends AppCompatActivity { 2 3 private static int PORT = 34567; //ポート宣言 4 DatagramSocket soc; //ソケット 5 PrintWriter printWriter; //ソケット送信用 6 String text; 7 int a = 1; 8 9 @Override 10 protected void onCreate(Bundle savedInstanceState) { 11 super.onCreate(savedInstanceState); 12 setContentView(R.layout.activity_main); 13 14 //サーバー用にソケットを作成し、ポートを設定する 15 try { 16 soc = new DatagramSocket(34567); 17 soc.bind(new InetSocketAddress(PORT)); 18 } catch (Exception e) { 19 e.printStackTrace(); 20 } 21 22 23 //接続されたら"1"を出力 24 SendSocTask sendSocTask = new SendSocTask(10); 25 sendSocTask.execute(); 26 text ="1"; 27 28 Button button1 = findViewById(R.id.button1); 29 button1.setOnClickListener(new View.OnClickListener() { 30 @Override 31 public void onClick(View view) { 32 SendSocTask sendSocTask = new SendSocTask(1); 33 sendSocTask.execute(); 34 text ="A"; 35 } 36 }); 37 38 Button button2 = findViewById(R.id.button2); 39 button2.setOnClickListener(new View.OnClickListener() { 40 @Override 41 public void onClick(View v) { 42 SendSocTask sendSocTask = new SendSocTask(2); 43 sendSocTask.execute(); 44 text ="B"; 45 } 46 }); 47 48 Button button3 = findViewById(R.id.button3); 49 button3.setOnClickListener(new View.OnClickListener() { 50 @Override 51 public void onClick(View v) { 52 SendSocTask sendSocTask = new SendSocTask(3); 53 sendSocTask.execute(); 54 text ="C"; 55 } 56 }); 57 } 58 59 class SendSocTask extends AsyncTask<InetSocketAddress, Void, Void> { 60 61 private int sendValue; 62 63 //コンストラクタ 64 public SendSocTask(int value) { sendValue = value; } 65 66 @Override 67 protected Void doInBackground(InetSocketAddress... inetSocketAddresses) { 68 try { 69 byte[] ms = text.getBytes(); 70 DatagramPacket packet = new DatagramPacket(ms, ms.length, new InetSocketAddress(InetAddress.getByName("PCのIPアドレス"),PORT)); 71 soc.send(packet); 72 } 73 catch (Exception e) { 74 } 75 finally { 76 try { 77 //通信後、Socket接続を閉じ、関連付けられたすべてのリソース解放 78 if (a == 0) { 79 printWriter.close(); 80 } 81 if (a==0) { 82 } 83 } 84 catch (Exception e) { 85 e.printStackTrace(); 86 } 87 } 88 return null; 89 } 90 } 91}
activity_main
xml
1<?xml version="1.0" encoding="utf-8"?> 2<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:app="http://schemas.android.com/apk/res-auto" 4 xmlns:tools="http://schemas.android.com/tools" 5 android:layout_width="match_parent" 6 android:layout_height="match_parent" 7 tools:context=".MainActivity"> 8 9 10 <Button 11 android:id="@+id/button1" 12 android:layout_width="wrap_content" 13 android:layout_height="wrap_content" 14 android:layout_marginEnd="10dp" 15 android:text="Button" 16 app:layout_constraintBaseline_toBaselineOf="@+id/button2" 17 app:layout_constraintEnd_toStartOf="@+id/button2" 18 app:layout_constraintStart_toStartOf="parent" /> 19 20 <Button 21 android:id="@+id/button2" 22 android:layout_width="wrap_content" 23 android:layout_height="wrap_content" 24 android:layout_marginEnd="10dp" 25 android:layout_marginBottom="324dp" 26 android:text="Button" 27 app:layout_constraintBottom_toBottomOf="parent" 28 app:layout_constraintEnd_toStartOf="@+id/button3" 29 app:layout_constraintStart_toEndOf="@+id/button1" /> 30 31 <Button 32 android:id="@+id/button3" 33 android:layout_width="wrap_content" 34 android:layout_height="wrap_content" 35 android:layout_marginEnd="1dp" 36 android:text="Button" 37 app:layout_constraintBaseline_toBaselineOf="@+id/button2" 38 app:layout_constraintEnd_toEndOf="parent" 39 app:layout_constraintStart_toEndOf="@+id/button2" /> 40</androidx.constraintlayout.widget.ConstraintLayout>
試したこと
soc.send(packet);やclass SendSocTask内のコードにwhile(true)を挟み込み、無理に無限ループで出力してみましたが、
タブレットの画面は真っ白になり(正常に表示される場合もありました)、UdpIpToolのログも当たり前ですが「1」だけ出力され、「切断」をクリックしても無限ループし続けていました。
補足情報(FW/ツールのバージョンなど)
上記にも記載しましたが、Android studioを使用し、javaで作成しています。
どうにか実現したい事ができないかインターネットで調べてみましたが、
まったく実現方法がわかりませんでした…
お手数をおかけしますが、プログラミングの力も未熟なため丁寧に説明もいただけると大変ありがたいです。
何か不明点あれば、ご質問いただけますと幸いです。
よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー