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

我试图使用一个处理程序在一段时间内执行一些代码.

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

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

解决方法:

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

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

上一篇:Android BlockCanary源码解析


下一篇:面试被问懵?带你一步一步深入Handler源码,不信还拿不下面试官?