【问题标题】:Android: Issue using a handler and postDelayed()Android:使用处理程序和 postDelayed() 的问题
【发布时间】:2011-05-20 18:16:47
【问题描述】:

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

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

我的一个类扩展了 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(); }
        }
    };

非常感谢,

杰瑞

【问题讨论】:

    标签: android handler looper


    【解决方案1】:

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

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

    【讨论】:

    • 我应该只使用 Timer 类吗?那么我要做的是发送一个 TCP 数据包并等待 30 秒,如果没有收到答案(即:其他客户端没有选择选项),终止并关闭连接。
    • 我也犯了一个小错误(可能并不重要),但该类实际上扩展了 Activity 而不是 Service。非常感谢。
    • 你在用 Socket 阅读吗?你不能用Socket.setSoTimeout()吗?
    • 问题是我想在 30 秒后发送一个数据包,告诉对方我正在取消该请求。将在我的初始帖子中更新我的代码。
    • 我找到了解决方案。在 onCreate 方法中定义处理程序可以修复它。其余代码相同。谢谢:)
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-01
      • 2016-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-08
      • 2014-02-21
      相关资源
      最近更新 更多