新しいスレッドを作成する 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) の変更を即座に開始できるとよいでしょう。