我正在尝试使用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
答案 0 :(得分:4)
你不能在工作线程中创建一个处理程序(除非它有一个looper,你通常不会这样做)。处理程序需要一个looper,因为它需要一个点来评估所有传入的消息并在必要时调用处理程序。
您的处理程序需要位于UI线程中。如果你想在工作线程中做一些事情,你需要做自己的消息处理(你可以在线程中使用同步方法来设置工作线程检查的成员变量),或者,如果你的线程更多的是事件 - 驱动品种,你真的可以考虑添加一个活套 - 但同样,这不是一种常见的做法。
答案 1 :(得分:2)
我找到了解决方案。在onCreate方法中定义处理程序可以修复它。其余的代码是相同的。谢谢:))