2015-01-04 95 views
0

我正在Xamarin中制作Android应用程序。该应用程序具有在后台运行的TCP侦听器。因此,当应用程序未打开时,此侦听程序仍处于活动状态,我已将它移动到作为服务运行。不幸的是,当开始时UI变得没有响应,并且崩溃而没有在调试器中抛出任何错误。C#Android服务崩溃没有错误

从一个活动一个新的线程启动服务:

 btnStart.Click += (object sender, EventArgs e) => 
     { 
      Thread listener = new Thread (() => 
      { 
       StartService(new Intent(this, typeof(MyService))); 
      }); 
      listener.Start(); 
     }; 

这里是从服务代码:

public override void OnStart(Android.Content.Intent intent, int startId) 
    { 
     base.OnStart (intent, startId); 
     Log.Debug ("Service Class", "Service has started"); 
     DoActions(); 
    } 

    public void DoActions() 
    { 
     Log.Debug("Service Class", "getting local IP!"); 
     IPHostEntry host; 
     string localIP = ""; 
     host = Dns.GetHostEntry(Dns.GetHostName()); 
     foreach (IPAddress ip in host.AddressList) 
     { 
      if (ip.AddressFamily == AddressFamily.InterNetwork) 
      { 
       localIP = ip.ToString(); 
       break; 
      } 
     } 

     int port = 1111; 
     IPAddress localaddr = IPAddress.Parse (localIP); 
     TcpListener tcpListener = new TcpListener (localaddr, port); 
     Log.Debug ("Service Class", "accepted local IP, starting listener"); 
     tcpListener.Start(); 
     Log.Debug ("Service Class", "You are now listening on " + localaddr + port); 
     while (true) 
     { 
      Socket socket = tcpListener.AcceptSocket(); 
      byte[] array = new byte[1024]; 
      socket.Receive (array); 
      string @string = Encoding.UTF8.GetString (array); 
      Log.Debug ("Service Class", "Message Received From Server:" + (@string.Replace ("\0", string.Empty))); 
     } 
    } 

我起床到“你现在监听” + localaddr + port“调试信息,在这种情况下,它是192.168.0.105端口1111.我有一个计时器写入调试x秒,在应用程序崩溃之前我会得到一些响应。用于将其作为来自同一活动的任务运行。

有没有一种方法可以将更多信息发送给调试器,以查明哪里出了问题? 我在4.2.2上使用Tronsmart mk908b进行测试

在此先感谢!

更新: 看来这可能与Android服务生命周期有关。仍在寻找解决这个问题的方法。

+0

请发布您的logcat。 – BeingMIAkashs

+0

http://pastebin.com/di7V7AMM – user1672867

+0

信息(364)/ InputDispatcher:应用程序没有响应:窗口{413e3dd0 u0 SecureX2.SecureX2/securex2.ListenActivity}。事件发生后5002.8ms,等待开始后5002.3ms。原因:正在等待,因为所触摸的窗口尚未处理之前传送给它的输入事件。 – user1672867

回答

0

请勿在线程内启动服务。

btnStart.Click += (object sender, EventArgs e) => 
    { 
     StartService(new Intent(this, typeof(MyService))); 
    }; 
+0

谢谢!我的理解是,如果我这样做,它会在ui线程上运行。现在测试 – user1672867

+0

结果相同:Info(364)/ InputDispatcher:应用程序没有响应:窗口{414d29e0 u0 SecureX2.SecureX2/securex2.ListenActivity}。事件发生后5003.0毫秒,等待开始后5002.8毫秒。原因:正在等待,因为所触摸的窗口尚未处理之前传送给它的输入事件。 – user1672867

+0

@ user1672867,你有答案吗? –