Android Studio 在Java中后台连续发送UDP数据包

rnmwe5a2  于 12个月前  发布在  Android
关注(0)|答案(2)|浏览(140)

我想通过UDP协议反复将按钮状态,操纵杆值等数据从我的应用程序发送到服务器以控制无人机,我搜索并尝试了无限while循环方法,但它使我的应用程序崩溃.我没有太多关于工作的知识,我只是想要一个客户端,发送一个字符串/JSON对象在后台连续作为数据报到定义的IP和端口。欢迎客户端的任何代码片段或建议。谢谢。目前使用Asynctask,但有人告诉我,它的弃用和不适合。代码如下。(重新发布)

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

import android.annotation.SuppressLint;

import android.os.AsyncTask;

public class UDP_Client {
    public String Message;
    @SuppressLint({"NewApi", "StaticFieldLeak"})
    public void sendUDP() {
        AsyncTask<Void, Void, Void> async_cient = new AsyncTask<Void, Void, Void>() {
            @Override
            protected Void doInBackground(Void... params){
                try (DatagramSocket ds = new DatagramSocket()) {
                    DatagramPacket dp;
                    dp = new DatagramPacket(Message.getBytes(), Message.length(), InetAddress.getByName("192.168.***.***"), 3000);
                    ds.setBroadcast(true);
                    ds.send(dp);

                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            protected void onPostExecute(Void result) {
                super.onPostExecute(result);
            }
        };
        async_cient.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
    }
}

字符串

u2nhd7ah

u2nhd7ah1#

我在主Activity中的一个单独的线程中使用while true(无限循环)完成了它。它工作得很好!

new Thread( new Runnable() { @Override public void run() {
        while(true) {
            // Execute if mainSwitch is "ON"
            if(mainSwitchOn[0]) {
                // Creating new UDP_Client class object and accessing the public message variable to send data through
                // sendUDP() function
                Intent i = getIntent();
                String IpAddr = i.getStringExtra("IpAddr");

                UDP_Client Client = new UDP_Client();
                Client.Message = output;
                Client.IpAddress = IpAddr;
                Client.sendUDP();
                try {
                    // Giving 2ms sleep time to update values in thread.
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    } } ).start();

字符串

svgewumm

svgewumm2#

如果你想在后台运行它。你需要使用服务。

相关问题