【问题标题】:Socket listener in IntentServiceIntentService 中的套接字侦听器
【发布时间】:2015-06-10 21:06:28
【问题描述】:

在我的程序中,我通过 IntentService 类中的套接字接收数据,然后将其作为广播发送到活动。 Activity 处理输入并准备输出。

while (true) {

            socket = serverSocket.accept();

            //Read data from socket

            //Publishing as a broadcast }

现在我的问题是

  1. 如何将活动的输出发送到 intentService? 我知道我可以向 intentService 发起新的意图,但由于我的 while 循环已经在无限循环中运行,这不会排队并且可能永远不会执行吗?
  2. 即使我设法从 Activity 获取数据到 intentService,我如何使用相同的套接字连接将数据写回客户端,还是应该为此创建一个单独的线程?

任何见解都会有所帮助。

【问题讨论】:

  • 你的意思是你想让这个循环继续下去,同时读取循环内活动发送的数据?
  • 是的,类似
  • 您可以将数据添加到队列中并从循环内的队列中获取
  • 不确定将数据添加到队列中是什么意思?你能说得更具体点吗?

标签: android sockets android-broadcast android-intentservice


【解决方案1】:

IntentService 是这种行为的错误选择。您应该使用常规的Service 并自己管理线程和连接。

然后,您可以通过使用包含数据的 Intent 调用 startService() 将数据从 Activity 发送到 Service,或者您可以将 Activity 绑定到 Service 并使用 AIDL(远程过程调用)。

【讨论】:

  • 我实际上最终使用了 Singleton,并在工作线程中创建了套接字侦听器并进行了相同的管理。
【解决方案2】:

我认为你应该改变你的实现,因为 IntentService 只有一个线程并且它被接受调用阻塞。可能您应该创建两个单独的线程来接受连接和处理连接的套接字。使用这种方法,您可以轻松地使用静态对象或通过广播接收器将数据共享到连接的套接字线程。请参考 android sdk 中的 Bluetoothchat 示例。

【讨论】:

    猜你喜欢
    • 2017-09-03
    • 1970-01-01
    • 1970-01-01
    • 2011-12-10
    • 2012-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多