3

Handler を使用して、一定時間内にコードを実行しようとしています。

これは私の2つのクラスでうまく機能しますが、私はこれで問題を抱えています:

私のクラスの 1 つは Activity を拡張し、(Runnable を実装する) Thread を開始します。

私の run() メソッドには、他のクラスと同様に次のものがあります。

mHandler = new Handler();
mHandler.removeCallbacks(StopRequest);
mHandler.postDelayed(StopRequest, 30000);

プログラムは不平を言っているようです:

java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()

投稿する理由がわかりません、誰か助けてくれませんか?

編集:私のコードの一部を追加する:

            out = new PrintWriter(new BufferedWriter(
                    new OutputStreamWriter(clientSocket.getOutputStream())), true);

            out.println("VOICE_CALL_REQUEST");

            // Wait for a response

            // Set a timer (about 30 seconds)
            mHandler = new Handler();
            mHandler.removeCallbacks(StopRequest);
            mHandler.postDelayed(StopRequest, 3000);

            // Ready reply
            InputStream stream = clientSocket.getInputStream();
            BufferedReader data = new BufferedReader(new InputStreamReader(stream));

            String line = data.readLine();
            mHandler.removeCallbacks(StopRequest); // Timer is removed here

タイマーが 30 秒に達した場合:

    // Stop a call request after some amount of time
    private Runnable StopRequest = new Runnable() {
        public void run() {
            // Send a message to cancel the voice call
            out.println("VOICE_CALL_CANCEL");

            // Close the port
            try {
                clientSocket.close();
            }
            catch (IOException e) { finish(); }
        }
    };

どうもありがとう、

ジャリー

4

2 に答える 2

4

ワーカー スレッドでハンドラーを作成することはできません (通常は作成しないルーパーがない限り)。すべての着信メッセージを評価し、必要に応じてハンドラーを呼び出すポイントが必要なため、ハンドラーにはルーパーが必要です。

ハンドラーは UI スレッドにある必要があります。ワーカー スレッドで何かをしたい場合は、独自のメッセージ処理を行う必要があります (ワーカー スレッドがチェックするメンバー変数を設定するスレッドで同期メソッドを使用できます)。ルーパーを追加することを検討することもできますが、これは一般的な方法ではありません。

于 2010-12-06T03:32:35.293 に答える
2

解決策を見つけました。onCreate メソッドでハンドラーを定義すると修正されます。コードの残りの部分は同じです。ありがとう :)

于 2010-12-06T05:00:19.997 に答える