在下面的代码中,我试图在按下按钮时运行一个线程。在按钮监听器中,我创建一个新线程并运行它...但在运行时,当按下按钮时,按钮本身会冻结,应用程序不响应,我收到
ANR
对话框。此外,当套接字成功连接时,甚至TexView
也会如此。mtvStatus.setText("RFC-SOCKET CONNECTED");
不显示任何内容。
请告诉我为什么会发生这种情况。
按钮监听器:
this.mbtnConnect.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
BluetoothSocket rfcSocket = mSPPCtrl.rfcConnect();
if (rfcSocket.isConnected()) {
mtvStatus.setText("RFC-SOCKET CONNECTED");
Thread rx = new Thread(new RxRun(rfcSocket));
rx.run();
} else {
mtvStatus.setText("RFC-SOCKET NOT CONNECTED");
}
}
});
可运行的类
private class RxRun implements Runnable {
private BluetoothSocket mRFCSocket = null;
private OutputStream mRFCOS = null;
private InputStream mRFCIS = null;
public RxRun(BluetoothSocket rfcSocket) {
this.mRFCSocket = rfcSocket;
try {
this.mRFCOS = rfcSocket.getOutputStream();
} catch (IOException e) {
e.printStackTrace();
}
try {
this.mRFCIS = rfcSocket.getInputStream();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void run() {
try {
this.mRFCOS.write(DIRON.getBytes());
} catch (IOException e) {
e.printStackTrace();
}
while (this.mRFCSocket.isConnected()) {
try {
int readBytes = this.mRFCIS.read(new byte[5120]);
Log.d(TAG, CSubTag.bullet("RxRun", "readBytes:" + readBytes));
//mtvRx.setText(""+readBytes);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
rx.start();
而不是rx.run();
- TitusThread
,而是应该使用ExecutorService
。.run()
方法是从Runnable
继承而来的,并不会自动在后台运行。另外,你打算如何收集结果呢? - fge