我已经构建了一个Android聊天应用程序。它有一个TCP服务器,使用Socket
连接到via。
我希望服务器连接始终在后台运行 - 即使应用程序不在前台 - 并监听从服务器发送的数据。
现在我使用while
循环检查是否有新内容,但当Android需要资源时,操作系统会关闭我的线程。
我考虑过在我的帖子中使用readline()
方法,而不是使用while
循环,因为readline()
是一种阻止方法。
这是正确的方法吗,这将导致防止操作系统杀死我的应用程序?
有没有办法,比如只有在传入套接字可用时才会启动的自定义广播接收器?
谢谢!
答案 0 :(得分:1)
简而言之,Android可以并且将会杀死任何占用资源的应用程序以便继续运行。 onus 是关于如何处理可能威胁您的应用被杀的情况的你。
我建议查看developer网站上的服务生命周期。
首先,任何应用程序,无论是服务/活动,都是如此,这种方式被认为......在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
变量是boolean
,是控制何时终止循环的决定变量。注意如何使用Thread.sleep
方法来“冷静”执行,如果省略,Android将在应用程序上放置一个十字线并终止它,换句话说,对系统资源是礼貌的。
提示: 扩展Thread
类,以保留通过accept()
方法处理传入连接的功能。
当incomingClientSocket
变为非空时,会创建另一个线程,在该线程中打开incomingClientSocket
的输入/输出流并使用二进制文件时尚。
不要使用readline
方法,因为这表明设计不佳并且假设数据是文本的,因为一个到客户端的传入数据包可能是例如720字节,下一个数据包进入之后那可能是564字节,这就是TCP / IP的本质。
您需要提出一种更可靠的方法来建立数据传输的边界,例如,开始和结束标记,让服务器读取传入的数据并区分由开始和结束组成的字节流标记,一旦存在,然后提取标记之间的真实数据并相应地对其进行操作。
例如,您可以在incomingClientSocket
上实际变为非空,向您的活动发送广播以对其进行操作,并让活动,接受该套接字,并打开连接并读取/写入/从与套接字关联的输入/输出流。