0

私はAndroidアプリを作成するのはかなり新しいので、センサーデータを一定の間隔(たとえば1秒)でブロードキャストするコードを作成したいと思いました。オープンソースコードの検索私はなんとか送信者クラスを次のように書くことができました:

public class Sender extends Thread {
    private static final String TAG = "Sending";
    private static final int PORT = 12346;
    private static final int TIMEOUT_MS = 500;
    private static final int BUF_SIZE = 1024;
    private WifiManager mWifi;

    Sender(WifiManager wifi) {
        mWifi = wifi;
    }

    public void run() {
        try {
            DatagramSocket socket = new DatagramSocket(PORT);
            socket.setBroadcast(true);
            socket.setSoTimeout(TIMEOUT_MS);
            sendData(socket);
            socket.close();
            Thread.sleep(1000);
        }
        catch (IOException ioe) {
            Log.e(TAG, "Couldn't send data", ioe);
        } 
        catch (InterruptedException ie) {
            Log.e(TAG,  "Can't sleep", ie);
        }
    }

    private void sendData(DatagramSocket socket) throws IOException {
        byte[] buf = new byte[BUF_SIZE];
        buf = object.toString().getBytes();
        InetAddress addr = InetAddress.getByName("192.168.0.255"); // TO FIX
        DatagramPacket packet = new DatagramPacket(buf, buf.length, addr, PORT);
        socket.send(packet);
    }

    public void main(String[] args) {
        new Sender(null).start();
        while (true) {
        }
    }
}

そして、これがonCreateメソッド内から開始する方法です。

public void onCreate(Bundle savedInstanceState) {
...

    new Sender((WifiManager) getSystemService(Context.WIFI_SERVICE)).start();
...
}

これで、ラップトップでWiresharkを開くと、アプリの起動時に1秒ごとではなく、1つのパケットしか送信されません。

誰かが私が間違ったことを指摘してもらえますか?正直なところ、私はスレッドなどにあまり詳しくないので、ここで明らかな何かが欠けている可能性があります...

編集

OK、runメソッドをループする必要があります。以下の回答の修正されたコードを参照してください。

4

1 に答える 1

2

修正された実行メソッドコードは次のとおりです。

public void run() {
            while (true) {
                try {
                    DatagramSocket socket = new DatagramSocket(PORT);
                    socket.setBroadcast(true);
                    socket.setSoTimeout(TIMEOUT_MS);
                    sendData(socket);
                    socket.close();
                    Thread.sleep(1000);
                }
                catch (IOException ioe) {
                    Log.e(TAG, "Couldn't send data", ioe);
                } 
                catch (InterruptedException ie) {
                    Log.e(TAG,  "Can't sleep", ie);
                }
            }
}
于 2012-04-15T08:14:56.063 に答える