0

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サーバーからの入力ストリームをチェックするのに費やしています。これもそれと関係があるかもしれません。

4

2 に答える 2

2

ここでHandler、、のインスタンスを作成しています。networkHandler

public Handler networkHandler = new Handler() {

したがって、UIスレッドに関連付けられます。

そして、あなたが言うとき:

メインアクティビティのハンドラーを使用して、ネットワークスレッドを開始した直後にインスタンス化します

irc.start();
networkHandler = irc.networkHandler;

そこのインスタンスを作成しているのではありませんHandler。あなたはそれへの参照をつかんでいるだけです。

実際には、非UIHandlerのメソッドでのインスタンスを作成する必要があります。run()Thread

于 2013-03-25T14:22:50.297 に答える
1

new Handler(new Handler.Callback() )内部で別のコンストラクターを使用してみてください

于 2013-03-25T14:14:10.527 に答える