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 メッセージをサーバーに送信できるメソッドもあります。私はサービスからそれを呼び出し、サービスコマンドは(ボタンクリックで)フラグメントから呼び出され、正常に動作します。

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() メソッドで 2 番目のスレッドを作成しようとしました

        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();

ただし、これによりアプリケーションがフリーズし、ユーザーはその間何もできなくなります。また、常にサーバーからの応答があるとは限りません (ループが空白行を読み取り、それを返す間、応答を受け取った可能性があります。

ですから、正しい方法でアドバイスや例を教えてください。サーバー リスナーがメッセージを受信し、フラグメント (UI) の変更を即座に開始できるとよいでしょう。

4

0 に答える 0