Android:使用handler和postDelayed()时出现问题

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(); }
        }
    };

Thanks a lot,

Jary

2个回答

4

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

您的处理程序需要在UI线程中。如果要在工作线程中执行某些操作,则需要进行自己的消息处理(可以使用同步方法在您的线程中设置成员变量,以供工作线程检查),或者,如果您的线程更多地是事件驱动类型,则确实可以考虑添加一个looper——但这并不是常见做法。


我应该只使用Timer类吗?我的意思是想发送一个TCP数据包,并等待30秒钟,如果没有收到答复(即:其他客户端没有选择),则终止并关闭连接。 - Jary
我也犯了一个小错误(可能不重要),但是这个类实际上扩展了Activity而不是Service。非常感谢。 - Jary
你是在使用Socket进行读取吗?你为什么不直接使用Socket.setSoTimeout()呢? - EboMike
问题是我想在30秒后发送一个数据包,告诉另一端我正在取消该请求。我将在我的初始帖子中更新我的代码。 - Jary
1
我找到了一个解决方案。在onCreate方法中定义处理程序可以解决这个问题。其余的代码是相同的。谢谢 :) - Jary
显示剩余3条评论

2
我找到了一个解决方案。在onCreate方法中定义处理程序可以解决此问题。其余代码相同。谢谢 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接