gpt4 book ai didi

java - 未调用 handleMessage 函数

转载 作者:搜寻专家 更新时间:2023-11-01 08:58:18 26 4
gpt4 key购买 nike

我正在帮助我的 friend 开发一个 Android 应用程序,我不明白为什么我无法获取 Handle 函数,handleMessage() 被调用。我目前正在尝试通过蓝牙进行通信,我有一个处理写入的线程和一个处理读取的线程,所以我想我在某个地方搞砸了。我真的不熟悉 Thread,我想知道是否有人能发现我的错误!我知道写入功能正在工作,因为我看到蓝牙芯片在写入"$$$"下面的代码后进入命令模式。

主要 Activity :

public class MainActivity extends Activity{
....
private final Handler mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
System.out.println("in mHandler");//NOT CALLED
switch (msg.what) {
case (MESSAGE_READING):
byte[] readBuf = (byte[])msg.obj;
String readMessage = new String(readBuf,0,msg.arg1);
System.out.println("READ: " + readMessage);
break;
default:
System.out.println("default!");
break;
}
}
};
...
}

@Override
protected void onCreate(Bundle savedInstanceState) {
...
mConnectThread = new ConnectThread(device, mHandler);
mConnectThread.run();
ListenerThread mListener = new ListenerThread(mConnectThread,mHandler);
mListener.run();
}

连接线程:

public class ConnectThread{

public final BluetoothSocket mmSocket;
public final BluetoothDevice mmDevice;
private final Handler mHandler;
public static ConnectedThread mConnectedThread;

public ConnectThread(BluetoothDevice device, Handler mHandler) {
// Use a temporary object that is later assigned to mmSocket,
// because mmSocket is final
BluetoothSocket bs = null;
mmDevice = device;

// Get a BluetoothSocket to connect with the given BluetoothDevice
try {
// MY_UUID is the app's UUID string, also used by the server code
UUID uuid = UUID.fromString("00001101-0000-1000-8000-00805f9b34fb"); //Standard Serial Port Service ID
bs = device.createRfcommSocketToServiceRecord(uuid);
} catch (IOException e) {
System.err.println("IOException in ConnectThread");
}

this.mHandler = mHandler;
mmSocket = bs;
}

public void run() {
//TODO Cancel discovery because it will slow down the connection

try {
// Connect the device through the socket. This will block
// until it succeeds or throws an exception
mmSocket.connect();
} catch (IOException connectException) {
// Unable to connect; close the socket and get out
try {
mmSocket.close();
} catch (IOException closeException) { }
return;
}

// Do work to manage the connection (in a separate thread)
mConnectedThread = new ConnectedThread(mmSocket, mHandler);
mConnectedThread.run();

}
...
}

连接线程:

public class ConnectedThread extends Thread {
....
public void manageConnectedSocket() {

byte[] buffer = new byte[1024]; // buffer store for the stream
int bytes; // bytes returned from read()

// Keep listening to the InputStream until an exception occurs
while (true) {
try {
// Read from the InputStream
bytes = mmInStream.read(buffer);
System.out.println("Reading bytes.");
status = MESSAGE_READING;
// Send the obtained bytes to the UI activity
Message msg = Message.obtain(mHandler, MESSAGE_READING, bytes, -1, buffer);
mHandler.sendMessage(msg);
} catch (IOException e) {
System.err.println("Error reading input");
break;
}
status = READY;
}
}
...
}

监听线程:

public class ListenerThread extends Thread {

...

public final BluetoothSocket mmSocket;
private final Handler mHandler;
private final ConnectedThread mConnectedThread;

public ListenerThread(ConnectThread mConnectThread, Handler mHandler){
this.mHandler = mHandler;
mmSocket = mConnectThread.mmSocket;
this.mConnectedThread = mConnectThread.getConnectedThread();
}

public void run(){
while (true){
if (getStatus() == READY){
write("$$$".getBytes());
break;
}
}
}
...
}

我查看了一些关于 handleMessage 的其他问题,但没有帮助。有什么想法吗?

编辑:刚刚意识到这是很多代码。基本上我将 mHandler 传递给我的不同线程,我认为这是发生了一些不好的事情的地方。我有 ConnectThreadConnectedThreadListenerThread。我正在查看蓝牙的 Android 文档说它在后台运行,因为一些调用(write,read,device.connect()) 正在阻塞调用。

最佳答案

我认为您的代码存在问题,您是通过 run() 方法启动线程,这意味着您只是在一个对象上执行 run() 方法.但是您必须调用 start() 方法,这将启动一个新线程并自动调用您的 run() 方法。

这里引用自 Thread.start() 方法文档

Causes this thread to begin execution; the Java Virtual Machine calls the run method of this thread.

关于java - 未调用 handleMessage 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17256654/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com