我是xamarin.forms的新手。我想构建一个可以使用System.net.Sockets接收消息的xamarin表单应用程序。我的问题是我能够接收消息但无法在UI上显示消息。
我正在使用依赖服务,所以我专门在每个平台上实现了socket方法,这是我在Android项目中的socket接收方法。我正在尝试使用消息中心将数据从android项目发送到PCL项目。 IResource是我在PCL中定义的类。
class SocketConnection : ISocket
{
Socket sSocket;
Socket serverSocket;
public void ReceiveMessage()
{
Int32 port = 7777;
IPAddress address = IPAddress.Parse("192.168.2.100");
IPEndPoint ipe = new IPEndPoint(address, port);
sSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
sSocket.Bind(ipe);
sSocket.Listen(0);
//receive message
serverSocket = sSocket.Accept();
Console.WriteLine("connection succeeded");
while (true)
{
byte[] recByte = new byte[4096];
int bytes = serverSocket.Receive(recByte, recByte.Length, 0);
IResource.data1+=Encoding.ASCII.GetString(recByte, 0, bytes);
MessagingCenter.Send<ISocket, string>(this,"new Messages",IResource.data1);
Console.WriteLine("client: " + IResource.data1);
//send message
if (IResource.data1.Equals("exit"))
{
break;
}
}
serverSocket.Close();
sSocket.Close();
}
}
在我的pcl项目中,我有一个按钮,当单击此按钮时,它将使用调用ReceiveMessage()方法。我还使用消息中心接收消息并在UI上显示它,但它没有成功。这是按钮单击的方法。有谁知道问题在哪里,是我没有正确使用消息中心,或其他什么。加:当单击按钮时,UI变得没有响应,我应该使用异步编程吗?怎么样?
提前致谢!
private async void Yes_Clicked(object sender, EventArgs e)
{
MessagingCenter.Subscribe<ISocket,string>(this,"new Messages", (socket, data) =>
{
Device.BeginInvokeOnMainThread(() => {
editor.IsVisible = true;
editor.Text = data;
});
});
DependencyService.Get<ISocket>().ReceiveMessage();
}
答案 0 :(得分:0)
问题出在哪里,就是我没有正确使用消息中心或其他东西。加:当单击按钮时,UI变得没有响应,我应该使用异步编程吗?
您正在使用while循环阻止UI线程。如果您希望UI响应,则需要启动一个新的线程:
Thread thread = new Java.Lang.Thread(() => {
while (true)
{
...
MessagingCenter.Send<ISocket, string>(this, "new Messages", data1);
...
});
thread.Start();