我现在有一个需求:某一个Activity通过UDP发送消息后,接收到消息并进行处理;然后打开另外一个Activity发送消息,并希望在该Activity中获取消息并进行处理(此时不希望第一个Activity还能够接收到消息)。按照疯狂Android讲义中的办法,我的思路是这样的。在第一个Activity发送消息后建立一个线程来接收消息,并通过Handler传递给第一个Activity处理。问题在于:如何让第二个Activity接收到消息并处理呢?我也是通过新建立一个线程来接收消息,通过Handler来传递。如果这样的话会出现两个Activity争夺消息的情况。请各位能指点一二,多谢了。部分代码如下:负责接收消息并传递给Handler的线程public class ReceiveMSGThread implements Runnable{
//该线程所负责处理的Socket
private DatagramSocket socket;
private Handler handler;
//该线程所处理的Socket所对应的输入流
String revData = null;
private byte revMSG[] = new byte[512];
final String TAG = "--ReceiveMessageThread--";
public ReceiveMSGThread(DatagramSocket socket,Handler handler) throws IOException
{
this.socket = socket;
this.handler = handler;
}
public void run()
{
while(true)
{
byte data[] = new byte[512];
DatagramPacket packetR = new DatagramPacket(data, data.length);
try {
socket.receive(packetR);
revData = new String(packetR.getData(),packetR.getOffset(),packetR.getLength());
handler.sendEmptyMessage(0);
Message msg = new Message();
msg.what = 0x123;
revMSG = packetR.getData();
String msgStr = byte2hex(revMSG);
msg.obj = msgStr; handler.sendMessage(msg);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}第一个Activity中部分代码new Thread(new ReceiveMSGThread(SingletonSocket.socket, handler)).start(); private Handler handler = new Handler()
{
@Override
public void handleMessage(Message msg)
{}}如果第二个Activity和第一个Activity中代码相同,就会出现Handler中信息只给某一个Activity传,而另一个Activity接收不到。再次感谢大家啦。
//该线程所负责处理的Socket
private DatagramSocket socket;
private Handler handler;
//该线程所处理的Socket所对应的输入流
String revData = null;
private byte revMSG[] = new byte[512];
final String TAG = "--ReceiveMessageThread--";
public ReceiveMSGThread(DatagramSocket socket,Handler handler) throws IOException
{
this.socket = socket;
this.handler = handler;
}
public void run()
{
while(true)
{
byte data[] = new byte[512];
DatagramPacket packetR = new DatagramPacket(data, data.length);
try {
socket.receive(packetR);
revData = new String(packetR.getData(),packetR.getOffset(),packetR.getLength());
handler.sendEmptyMessage(0);
Message msg = new Message();
msg.what = 0x123;
revMSG = packetR.getData();
String msgStr = byte2hex(revMSG);
msg.obj = msgStr; handler.sendMessage(msg);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}第一个Activity中部分代码new Thread(new ReceiveMSGThread(SingletonSocket.socket, handler)).start(); private Handler handler = new Handler()
{
@Override
public void handleMessage(Message msg)
{}}如果第二个Activity和第一个Activity中代码相同,就会出现Handler中信息只给某一个Activity传,而另一个Activity接收不到。再次感谢大家啦。
2、假设你另起了一个线程来做这些网络IO,那么就不存在activity竞争消息了。你应该改变思路,当网络线程接受到返回消息后,保存到队列里头,再进行内容的转发。你可以建立一个字典,当消息返回的时候通过消息标志查找对应的回调,回调中再post给相应的activity的handler。
你好 我是个Android小小菜鸟 你说的没看太懂 我现在的做法是发送消息是在UI线程里面,接收是单独的线程。如何保存到队列并进行回调我不是很清楚您能具体说说吗?谢谢了。