我有创建新线程的android服务。
@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)上的更改会很棒。