2

私はAndroidアプリケーションを開発しています。

このアプリケーションには、サーバーとして DatagramSocket を開始するためのサーバーがあります。着信メッセージを待ちます。ソケットがメッセージを受け取ると、それを処理します。

UDP サーバー ソケットを開始するには、ローカル サービスを使用します。このサービスには、着信メッセージをリッスンするワーカー スレッドがあります。

これは私の未完成のローカル サービスの実装です。

public class UDPSocketBackgroundService extends Service
{
    private static final String TAG = "UDPSocketBackgroundService";
    private ThreadGroup myThreads = new ThreadGroup("UDPSocketServiceWorker");
    private Handler mServiceHandler;

    @Override
    public void onCreate()
    {
        super.onCreate();
        Log.v(TAG, "in onCreate()");
    }

    @Override
    public IBinder onBind(Intent arg0)
    {
        try
        {
            new Thread(myThreads, new UDPServerThread("X", 8888)).start();
        }
        catch (IOException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }
}

そして、これも未完成のワーカー スレッドの実装です。

public class UDPServerThread extends Thread
{
    private static final int MESSAGE_SIZE = 256;

    protected DatagramSocket socket = null;
    protected boolean end = false;

    public UDPServerThread(String serverName, int port) throws IOException
    {
        super(serverName);
        socket = new DatagramSocket(port);
    }

    public void run()
    {
        while (!end)
        {
            try
            {
                byte[] buf = new byte[MESSAGE_SIZE];

                // Wait an incoming message.
                DatagramPacket packet = new DatagramPacket(buf, buf.length);
                socket.receive(packet);
                // TODO: Notify Service with packet received
            }
            catch (IOException e)
            {
                // TODO Mensaje de error.
                e.printStackTrace();
            }
        }
    }
}

これらのクラスには独自のファイルがあります (それらは別のファイルにあります)。

ここ:

socket.receive(packet);
//TODO: Notify Service with packet received

パケットを受信したことをサービスに通知するにはどうすればよいですか? そのパケットもサービスに送りたいです。

メイン スレッドからワーカー スレッドに通信する方法の例を次に示しますしかし、それは必要ありません。ワーカー スレッドからサービスに通信する方法の例を探しています。

この例を見つけましたが、その例では両方のクラスが同じファイルで宣言しているため、よくわかりません。

ご覧のとおり、私は Android 開発の初心者です。

より良いアプローチを知っている場合は、教えてください。

4

1 に答える 1

0

UDPServerThread を作成するときに、UDPSocketBackgroundService への参照を渡し、パケットを受信したときにそのメソッド (processPacket() など) を呼び出すことができます。この processPacket() メソッドは、何らかの同期を使用する必要があります。

関連する関数の小さなコードの抜粋を次に示します。

public class UDPSocketBackgroundService extends Service
{
    ....
    @Override
    public IBinder onBind(Intent arg0)
    {
        try
        {
            new Thread(myThreads, new UDPServerThread(this, "X", 8888)).start();
            // Notice we're passing in a ref to this  ^^^
        }
        ...
    }
    public void processPacket(DatagramPacket packet)
    {
        // Do what you need to do here, with proper synchronization
    }
}

public class UDPServerThread extends Thread
{
    private static final int MESSAGE_SIZE = 256;

    protected DatagramSocket socket = null;
    protected boolean end = false;
    protected UDPSocketBackgroundService = null;

    public UDPServerThread(UDPSocketBackgroundService service, String serverName, int port) throws IOException
    {
        super(serverName);
        this.service = service;
        socket = new DatagramSocket(port);
    }

    ...

    public void run()
    {
        while (!end)
        {
            try
            {
                byte[] buf = new byte[MESSAGE_SIZE];

                // Wait an incoming message.
                DatagramPacket packet = new DatagramPacket(buf, buf.length);
                socket.receive(packet);
                service.processPacket(packet);
            }
            ...
        }
        ...
    }
}

このアプローチでは、UDPSocketBackgroundService が UDPServerThread と「密結合」されていることに注意してください。これが機能するようになったら、カップリングの少ないよりエレガントなデザインでリファクタリングすることを検討するかもしれませんが、今のところはこれでうまくいくはずです:)

于 2012-06-11T10:23:35.247 に答える