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