Android 使用AsyncTask发送单个UDP数据包

Android 使用AsyncTask发送单个UDP数据包,android,Android,我正在我的计算机上运行一个python服务器,它一直在循环,等待数据被接收,当它接收到数据时,它会打开\关闭我房间的灯 为了更好地控制它,我创建了一个应用程序,当我按下按钮切换灯光时,它会向服务器发送UDP数据包。我的代码是: public class MainActivity extends AppCompatActivity { private TextView txtView; @Override protected void onCreate(Bundle sa

我正在我的计算机上运行一个python服务器,它一直在循环,等待数据被接收,当它接收到数据时,它会打开\关闭我房间的灯

为了更好地控制它,我创建了一个应用程序,当我按下按钮切换灯光时,它会向服务器发送UDP数据包。我的代码是:

public class MainActivity extends AppCompatActivity {
    private TextView txtView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        txtView = findViewById(R.id.status);
        new Client(this).execute("init");
    }

    public void toggle(View view) {
        new Client(this).execute("toggle");
    }


    private static class Client extends AsyncTask<String, String, String> {
        DatagramSocket clientSocket;
        String address = "192.168.1.243";
        int port = 6789;
        private WeakReference<MainActivity> activityReference;

        Client(MainActivity context) {
            activityReference = new WeakReference<>(context);
        }

        @Override
        protected String doInBackground(String... strings) {
            try {
                clientSocket = new DatagramSocket();
                byte[] sendData = strings[0].getBytes();
                publishProgress("waiting for data");
                DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, InetAddress.getByName(address), port);
                clientSocket.send(sendPacket);
                if (strings[0].equals("init")) {
                    // Receive result
                    DatagramSocket serverSocket = new DatagramSocket(6789);
                    byte[] receiveData = new byte[0];
                    DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
                    serverSocket.receive(receivePacket);
                    publishProgress(new String(receivePacket.getData(), 0, receivePacket.getLength()));
                }
            } catch (SocketException e) {
                e.printStackTrace();
            } catch (UnknownHostException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (clientSocket != null)
                    clientSocket.close();
            }
            return address;
        }

        @Override
        protected void onProgressUpdate(String... strings) {
            super.onProgressUpdate(strings);
            activityReference.get().txtView.setText(strings[0]);
        }
    }
}
然而,通过这种方式,我每次按下按钮时都会创建一个AsyncTask,我想知道这是一种好的做法还是有更好的方法来实现这一点。
谢谢。

是的,创建AsyncTask的新实例非常好。您无论如何都不能重新运行它。

谢谢您的帮助