1

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

4

0 回答 0