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