2

我已经构建了一个 Android 聊天应用程序。它有一个 TCP 服务器,该服务器使用Socket.

我希望服务器连接始终在后台工作 - 即使应用程序不在前台 - 并监听从服务器发送的数据。

现在我正在使用一个while循环来检查是否有新的东西,但是当 Android 需要资源时操作系统会关闭我的线程。

我考虑过readline()在我的线程中使用该方法而不是使用while循环,因为readline()它是一种阻塞方法。

这是采取正确的方法吗,这将导致防止操作系统杀死我的应用程序?

有什么办法,比如只有当传入套接字可用时才会启动的自定义广播接收器?

谢谢!

4

1 回答 1

1

简而言之,Android 可以并且将会杀死任何占用资源以继续运行的应用程序。如何处理可能威胁您的应用程序被杀死的场景是责任。

我建议查看开发者网站上的服务生命周期。

首先,任何占用太多的应用程序,无论是服务/活动,以这种方式被认为是......在Android眼中是“粗鲁”的,因此无论如何都准备以这种方式被杀死!

例如,在onLowMemory覆盖方法中监听并采取相应的行动,例如保存数据等。

真正应该发生的事情是,服务会生成一个线程,以这种方式定期侦听传入的连接,

while (!terminating){
     Socket incomingClientSocket = ourServerSocket.accept();
     // How you handle this part is up to you?
     Thread.sleep(500); // Sleep for 500 ms
}

terminating变量是 aboolean并且是控制何时终止循环的决定性变量。注意该Thread.sleep方法是如何使用的,以“冷静”执行,如果省略,Android 将在应用程序上放置一个十字准线并终止它,换句话说,对系统资源有礼貌。

提示:扩展Thread类,以保持通过该accept()方法处理传入连接的功能。

incomingClientSocket变为非空时,将创建另一个线程,在该线程中它打开 的输入/输出流并使用二进制incomingClientSocket方式对其进行读/写。

不要使用该readline方法,因为这表明设计不佳并假设数据是文本的,因为到客户端的一个传入数据包可能是例如 720 字节,之后传入的下一个数据包很可能是 564 字节,这就是 TCP/IP 的本质。

你需要想出一种更可靠的方式来建立数据传输的边界,例如开始和结束标记,并让服务器读取传入的数据并区分由开始和结束标记组成的字节流,一次两者都存在,然后提取标记之间的真实数据并据此采取行动。

例如,您可以说,当incomingClientSocket它实际上变为非空时,向您的活动发送广播以对其进行操作,并让活动,获取该套接字,并打开连接并从输入/输出读/写与套接字关联的流。

于 2012-09-22T23:21:17.217 回答