IRCサーバーに接続する新しいスレッドを呼び出すコードがあります。スレッドには、IRCサーバーからの応答をリッスンするループがあり、メソッド「ProcessData」を呼び出して応答を実行します。
私のUIで、onStopとonPauseでIRCサーバーを「終了」できるようにしたいと思います。私が抱えている問題は、ハンドラーを使用してIRCスレッドにメッセージを送信し、IRCサーバーにQUITコマンドを送信すると、UIスレッドでネットワーク操作を実行していることを通知することです。
ハンドラーはIRCManagerクラスでセットアップされます(このクラスはThreadを拡張し、別のスレッドで実行するクラスです。
public Handler networkHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
try {
processData((String) msg.obj);
} catch (IOException e) {
Log.e(TAG, "network handler given an object NOT of type String");
}
super.handleMessage(msg);
}
};
メインアクティビティのハンドラーを使用して、ネットワークスレッドを開始した直後にインスタンス化します
irc.start();
networkHandler = irc.networkHandler;
onPauseイベントで、ハンドラーにメッセージを送信します
Message msg = new Message();
msg.obj = IRCManager.QUIT;
networkHandler.sendMessage(msg);
編集:これがprocessDataメソッドです
void processData(String data) throws IOException {
if (data.contains("PING")) {
String pingId = data.substring(6, data.length());
sendMessage(pong + pingId + "\n");
isConnected = true;
Message msg = new Message();
msg.what = 1;
msg.obj = "test";
handler.sendMessage(msg);
} else if (data.contains("Welcome")) {
sendMessage("PRIVMSG " + BOT_NAME + " JOIN " + siteId + "\n");
} else if (data.contains(IRCManager.QUIT)) {
disconnect();
} else if (isClientConnected()) {
Message msg = new Message();
msg.what = 2;
msg.obj = "test";
handler.sendMessage(msg);
}
}
ハンドラーがスレッドに正しくリンクしていないようです。誰かが私がこれを行う方法に光を当てることができますか?
私のスレッドは実際にその時間の99%をwhileループでIRCサーバーからの入力ストリームをチェックするのに費やしています。これもそれと関係があるかもしれません。