2

我正在使用 Android 蓝牙指南中的此示例代码,可在http://developer.android.com/guide/topics/connectivity/bluetooth.html的“作为客户端连接”下找到。

private class ConnectThread extends Thread {
private final BluetoothSocket mmSocket;
private final BluetoothDevice mmDevice;

public ConnectThread(BluetoothDevice device) {
    // Use a temporary object that is later assigned to mmSocket,
    // because mmSocket is final
    BluetoothSocket tmp = 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
        tmp = device.createRfcommSocketToServiceRecord(MY_UUID);
    } catch (IOException e) { }
    mmSocket = tmp;
}

public void run() {
    // Cancel discovery because it will slow down the connection
    mBluetoothAdapter.cancelDiscovery();

    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)
    manageConnectedSocket(mmSocket);
}

/** Will cancel an in-progress connection, and close the socket */
public void cancel() {
    try {
        mmSocket.close();
    } catch (IOException e) { }
}

}

在我的 onCreate 中,我调用

protected void onCreate(Bundle savedInstanceState) {
    setContentView(R.layout.activity_main);
    super.onCreate(savedInstanceState);
    connectionManager= new ConnectionManager(this);
    connectionManager.start();

connectionManager 启动一个 ConnectThread 并且连接线程成功连接到另一个蓝牙设备。但是,直到 ConnectThread 返回(确切地说,当 mmSocket.connect() 停止阻塞时)才会呈现布局。如何让布局首先显示?

4

3 回答 3

1

与其从 UI 线程创建连接管理器,不如在工作线程中创建它,如下所示:

protected void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.activity_main);
super.onCreate(savedInstanceState);
new Thread(new Runnable() {

            @Override
            public void run() {
               connectionManager= new ConnectionManager(YourActivity.this);
               connectionManager.start();
            }
        }).start();

这样你就永远不会阻塞 UI 线程,希望这会有所帮助......

问候!

于 2013-07-24T21:57:48.540 回答
0

请记住,setContentView()只有在onCreate()方法返回后才采取行动。考虑到这一点,您应该在另一个线程中而不是在 UI 线程中运行代码。

您的代码应如下所示:

protected void onCreate(Bundle savedInstanceState) {
    setContentView(R.layout.activity_main);
    super.onCreate(savedInstanceState);
    new Thread(new Runnable() {

            @Override
            public void run() {
               connectionManager= new ConnectionManager(this);
               connectionManager.start();
            }
    }).start();
}
于 2013-07-24T22:24:13.650 回答
0

您可以将其包装在异步任务 http://developer.android.com/reference/android/os/AsyncTask.html

于 2013-07-24T22:14:35.370 回答