我试图使用一个处理程序在一段时间内执行一些代码.
这在我的两个课程中效果很好,但是我遇到了这个问题:
我的一个类扩展了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线程中.如果你想在工作线程中做一些事情,你需要做自己的消息处理(你可以在线程中使用同步方法设置工作线程检查的成员变量),或者,如果你的线程更多的是事件 – 驱动品种,你真的可以考虑添加一个活套 – 但同样,这不是一种常见的做法.