簡體   English   中英

將工作線程與主線程進行通信

[英]Communicate worker thread with main thread

我正在開發一個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;
    }
}

這是我同樣未完成的 Worker Thread實現:

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開發的新手。

如果您知道更好的方法,請告訴我。

創建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“緊密耦合”。 一旦完成這項工作,您可以考慮使用耦合度較小的更優雅的設計來重構它,但是現在這應該可以幫助您:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM