如果我的计算机上已打开TCP / IP服务器套接字,我会制作一个每X分钟检查一次的Android应用。如果是,它会建立连接并从中读取数据,如果没有,它会等待并尝试在X min再次连接......
当我首先打开服务器然后再打开客户端(手动)时,下面的代码工作一次,但是我无法让客户端继续检查服务器套接字是否基于时间打开/收听。 异步方法无法工作,因为我无法延迟,我无法使用Handler方法。
CheckserversocketeveryXmin.java
public class AppListener extends Async {
@Override
public void handleMessage(Message msg) {
final Handler h = new Handler();
final int delay = 5000; //milliseconds
h.postDelayed(new Runnable() {
public void run() {
try {
String msg_received = null;
System.out.println("LISTENING FOR LAST INSTALLED APP");
System.out.println("TRY");
Socket socket = new Socket("85.190.178.23", 5050);
// Get data sent through socket
DataInputStream DIS = new DataInputStream(socket.getInputStream());
System.out.println("DataInputStream Started");
// read data that got sent
msg_received = DIS.readUTF();
System.out.println("Message from server" + msg_received);
// Might not want to close socket, or only the first string will be sent and none after
socket.close();
} catch (Exception e) {
System.out.println("Did not receive string");
}
h.postDelayed(this, delay);
}
}, delay);
}
}
现在我可能会犯这个错误,把这个代码放到我的主Activity中,由于某种原因它会每隔x秒尝试一次但是从来没有连接,因为如果我删除延迟,它就连接一次。
在Async中放置一个无限循环(我知道这不是技术上的好)并且等待/延迟是一个好方法吗?如果是这样,你们中的任何人都有一个指针:)
答案 0 :(得分:0)
将此代码放入我的主Activity中,由于某种原因,它每隔x秒尝试一次,但从不进行连接
您可能是SDK 11+,因此您的处理程序正在抛出一个NetworkOnMainThreadException
,您正在吞并你的阻止块
如果我删除了延迟
,它会在这里连接一次
您在Handler
内声明了handleMessage
变量,因此在将runnable发布到句柄后,您会立即删除对它的所有引用;它可能是垃圾收集。在AppListener
类