Java 即使I';我正在做另一件事
我有一段代码,只要点击一个按钮,服务就会从一个新线程启动,服务就会启动我的TCP客户端 TCP客户端一旦连接,将发送一个倒计时事件,通知片段继续工作 代码如下所示Java 即使I';我正在做另一件事,java,android,multithreading,ui-thread,countdownlatch,Java,Android,Multithreading,Ui Thread,Countdownlatch,我有一段代码,只要点击一个按钮,服务就会从一个新线程启动,服务就会启动我的TCP客户端 TCP客户端一旦连接,将发送一个倒计时事件,通知片段继续工作 代码如下所示 connectButton = (Button) view.findViewById(R.id.connectBT); connectButton.setOnClickListener(new View.OnClickListener() { @Override p
connectButton = (Button) view.findViewById(R.id.connectBT);
connectButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
new Thread(new Runnable() {
@Override
public void run() {
try {
// ***** IntentService Way ****** //
Intent intent = new Intent(getActivity(), NetworkService.class);
getActivity().startService(intent);
// Once client is connected, give the server some info about client
mCountDown.await(3000, TimeUnit.MILLISECONDS);
String json = jsonMaker.toJson(new DeviceInfo());
DispatchToServer(json);
} catch (Exception ie) {
ie.getMessage();
}
}
}).run();
但是,当我单击“连接”时,由于某种原因,我的UI仍然会冻结,即使我正在等待一个不同的线程,而不是UI线程。当我使用AsyncTask而不是服务时,同样的代码工作正常。尝试调用thread.start()而不是thread.run()使用thread.start()而不是thread.run()
new Thread(new Runnable() {...}).run();
Thread#run
只是Thread
类对Runnable
接口的实现。它所做的只是委托给传递给构造函数的run
方法
Java线程是通过start
方法启动的:
new Thread(new Runnable() {...}).start();
我真是个白痴!这就是当你累了的时候编写代码时会发生的事情。谢谢谢谢,我确实知道这一点,但由于某种原因,我在这个非常重要的细节上被遮住了。感觉像个哑巴,这是很常见的陷阱。避免这种情况的一个好方法就是不要使用原始线程;相反,我更喜欢执行者服务。