如何在服务上创建的线程上创建服务器的侦听器?

时间:2013-09-04 05:47:04

标签: android multithreading listener android-service

我有安装新线程的安卓服务。

@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)上的更改,这将是很棒的。

0 个答案:

没有答案