Android:使用处理程序和postDelayed()发出问题

时间:2010-12-06 03:28:26

标签: android handler looper

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

这在我的两个课程中运作良好,但我正在解决这个问题:

我的一个类扩展了Activity,并启动了一个Thread(实现了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(); }
        }
    };

非常感谢,

Jary

2 个答案:

答案 0 :(得分:4)

你不能在工作线程中创建一个处理程序(除非它有一个looper,你通常不会这样做)。处理程序需要一个looper,因为它需要一个点来评估所有传入的消息并在必要时调用处理程序。

您的处理程序需要位于UI线程中。如果你想在工作线程中做一些事情,你需要做自己的消息处理(你可以在线程中使用同步方法来设置工作线程检查的成员变量),或者,如果你的线程更多的是事件 - 驱动品种,你真的可以考虑添加一个活套 - 但同样,这不是一种常见的做法。

答案 1 :(得分:2)

我找到了解决方案。在onCreate方法中定义处理程序可以修复它。其余的代码是相同的。谢谢:))