【问题标题】:handleMessage function not being called未调用handleMessage函数
【发布时间】:2013-06-23 00:34:48
【问题描述】:

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

主活动:

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()) 正在阻塞调用。

【问题讨论】:

    标签: java android multithreading bluetooth handler


    【解决方案1】:

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

    这是来自Thread.start()方法文档的引用

    使该线程开始执行; Java虚拟机调用该线程的run方法。

    【讨论】:

    • 所以我所有当前在我的Thread 类中的本地run() 方法中的代码都应该移到start()
    • 哦,等等,也许我不够清楚,您不必将代码移动到任何地方,只需执行类似 mConnectThread.start() 而不是 mConnectThread.run() 的操作。
    • 更糟糕的是,现在我无法连接到蓝牙设备。
    • 现在卡在哪里了?你有一些例外还是什么?
    • 我在ListenerThread 中得到了一个NullPointerException,可能是因为在线程创建之前无法访问它?
    猜你喜欢
    • 2016-03-16
    • 2016-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-18
    • 2019-12-19
    相关资源
    最近更新 更多