使用 c# 启动帮助第一个 Android 应用程序

Posted

技术标签:

【中文标题】使用 c# 启动帮助第一个 Android 应用程序【英文标题】:Starting Help First Android app with c# 【发布时间】:2016-02-29 15:07:28 【问题描述】:

我正在尝试在 c# 中使用 VS Community 2015 编写一个 android 应用程序 应用程序应该向 websocket 发送一条消息,并显示它收到的答案。

这是我的 MainActivity.cs

public class MainActivity : Activity



    protected override void OnCreate(Bundle bundle)
    
        base.OnCreate(bundle);

        // Set our view from the "main" layout resource
        SetContentView(Resource.Layout.Main);

        // Get our button from the layout resource,
        // and attach an event to it
        Button button = FindViewById<Button>(Resource.Id.MyButton);
        TextView t1 = FindViewById<TextView>(Resource.Id.textView1);

        button.Click += delegate
        
            string msg = SetStatusText();
            t1.SetText(msg,TextView.BufferType.Normal);
        ;

    

    private string SetStatusText()
    
        Connector c = new Connector();
        c.Connect();
        return c.msg;

    

连接器是这样的

class Connector

    public string msg  get; set; 

    WebSocket websocket = new WebSocket("ws://192.168.1.103:2012/");
    public void Connect()
    
        websocket.Opened += new EventHandler(websocket_Opened);
        websocket.MessageReceived += new EventHandler<MessageReceivedEventArgs>(websocket_MessageReceived);
        websocket.Open();
    

    private void websocket_MessageReceived(object sender, MessageReceivedEventArgs e)
    
        msg = e.Message;
    

    private void websocket_Opened(object sender, EventArgs e)
    
        websocket.Send("Status");
       



在调试模式下,我看到 websocket 在连接器的 msg 变量中返回的消息,但是我将它返回到 MainActivity 的方式不起作用。它保持为 NULL。

【问题讨论】:

【参考方案1】:

您在连接到 WebSocket 后使用“msg”变量,这将失败,因为您仍然没有收到消息,您需要以某种方式等待 websocket_MessageReceived 被执行。

如果您想等到收到消息,您可以使用事件:

class Connector

    public string msg  get; set; 
    public event EventHandler MessageReceived;

    WebSocket websocket = new WebSocket("ws://192.168.1.103:2012/");
    public void Connect()
    
        websocket.Opened += new EventHandler(websocket_Opened);
        websocket.MessageReceived += new EventHandler<MessageReceivedEventArgs>(websocket_MessageReceived);
        websocket.Open();
    

    private void websocket_MessageReceived(object sender, MessageReceivedEventArgs e)
    
        msg = e.Message;
        if(MessageReceived != null)
            MessageReceived(this, EventArgs.Empty);
    

    private void websocket_Opened(object sender, EventArgs e)
    
        websocket.Send("Status");
       

然后,当您创建连接时,您可以:

c.MessageReceived += (o,e) => t1.SetText(c.msg,TextView.BufferType.Normal);

【讨论】:

不行,我看到变量已填充,如果打开套接字,则发送消息“状态”,并触发消息接收事件并设置 msg。 不,它没有,你在调试时看到它,因为你设置了一个断点给服务器足够的时间发送消息,当你不设置断点时没有足够的时间和在您尝试使用它之前它不会到达。 如果你想要一个证明,将你的函数转换为异步,并在 c.Connect() 之后添加 await Task.Delay(5000),然后它会工作,但不要使用它生产,因为连接和消息之间的间隔是可变的。 好的,我会测试它。还是有其他方法来实现这一点?也许连接器类可以在收到的事件中更新文本视图? 这将是正确的方法,您可以使用回调或在 Connector 类上公开事件处理程序。

以上是关于使用 c# 启动帮助第一个 Android 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

Android跨进程通信AIDL服务

通过单击应用程序图标(来自后台)打开时反应本机android应用程序重新启动

用C#编写百度地图Android手机应用程序(第3讲)

由任务计划程序启动时隐藏 C# winform 应用程序窗口

Android 跨进程启动Activity黑屏(白屏)的三种解决方案

在android应用程序中启动浏览器[重复]