3

我正在尝试使用 Handler 在一段时间内执行一些代码。

这在我的两个课程中效果很好,但我遇到了这个问题:

我的一个类扩展了 Activity,并启动了一个线程(实现了 Runnable)。

在我的 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 回答