我有安装新线程的安卓服务。
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
t = new ConnectionThread();
t.start();
return Service.START_NOT_STICKY;
}
在那个线程上,我正在打开套接字连接并使其保持活动状态。看起来像这样
@Override
public void run() {
try {
InetAddress serverAddr = InetAddress.getByName(SERVER_IP);
socket = new Socket(serverAddr, SERVERPORT);
} catch (IOException e) {
e.printStackTrace();
}
}
在这个线程上我也有可以向服务器发送JSON消息的方法。我从服务和服务命令调用它从片段调用(在buttonclick上),它工作正常。
public String sendJSON() {
JSONObject messageJson = new JSONObject();
JSONObject mJson = new JSONObject();
try {
mJson.put("Type", "ReadyToBind");
messageJson.put("DeviceID", "myDeviceID");
messageJson.put("AllowFastBind", true);
mJson.put("Message", messageJson);
} catch (JSONException e) {
e.printStackTrace();
}
PrintWriter out = null;
try {
out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
out.println(mJson);
} catch (IOException e) {
e.printStackTrace();
}
return message2;
}
但主要问题是服务器在3秒内给出响应。这意味着它可以立即给出响应,也可以等待0-3秒并给出不同的响应。
我应该如何为服务器实现监听器?它应该监听从服务器收到的命令并与应用程序做出反应(更改当前片段UI)。
我试图在sendJson()方法
上创建第二个线程 mThread = new ConnectionThread2ndLevel(socket);
mThread.start();
long start = System.currentTimeMillis();
long end = start + 3 * 1000; // 3 seconds * 1000 ms/sec
while (System.currentTimeMillis() < end){
message2 = mThread.getMessage();
}
在那个Thread run()方法上,我只是阅读并在getMessage()上我只返回收到的消息。
scanner = new Scanner(socket.getInputStream());
message2Thread = scanner.nextLine();
但这冻结了应用程序,用户在此期间无能为力。也不总是我得到了服务器的响应(也许我得到了响应,并在while循环读取空行然后将其返回。
那么请你能给我一个建议或示例如何以正确的方式做到这一点?服务器监听器可以接收消息并立即启动片段(UI)上的更改,这将是很棒的。