0

我在我的计算机上运行一个 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,我想知道这是否是一种好的做法,或者有更好的方法来实现这一点。谢谢。

4

1 回答 1

1

是的,创建一个新的AsyncTask. 无论如何,您不能重新运行它。

于 2018-06-12T13:00:46.757 回答