[英]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.