Android 使用AsyncTask发送单个UDP数据包
我正在我的计算机上运行一个python服务器,它一直在循环,等待数据被接收,当它接收到数据时,它会打开\关闭我房间的灯 为了更好地控制它,我创建了一个应用程序,当我按下按钮切换灯光时,它会向服务器发送UDP数据包。我的代码是:Android 使用AsyncTask发送单个UDP数据包,android,Android,我正在我的计算机上运行一个python服务器,它一直在循环,等待数据被接收,当它接收到数据时,它会打开\关闭我房间的灯 为了更好地控制它,我创建了一个应用程序,当我按下按钮切换灯光时,它会向服务器发送UDP数据包。我的代码是: public class MainActivity extends AppCompatActivity { private TextView txtView; @Override protected void onCreate(Bundle sa
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的新实例非常好。您无论如何都不能重新运行它。谢谢您的帮助