接続ごとに個別のスレッドを作成してみてください-同様の問題があり、接続ごとに新しいスレッドを作成するとうまく解決しました。ちなみに、接続を確立するために新しいスレッドを作成することもできます。そのため、接続を確立しても UI がブロックされることはありません。BTサンプルコードからこれを得ました...
新しいスレッドを作成して接続を確立するには:
    mConnectBluetoothThread = new ConnectBluetoothThread(device);
    mConnectBluetoothThread.start();
ConnectBluetoothThread は次のように定義されます。
public ConnectBluetoothThread(BluetoothDevice device) {
        if (DEBUG)
        Log.i(this.getClass().getSimpleName(),
            this.getClass().getName()
                + " ->"
                + Thread.currentThread().getStackTrace()[2]
                    .getMethodName());
        mmDevice = device;
        BluetoothSocket tmp = null;
        // Get a BluetoothSocket for a connection with the
        // given BluetoothDevice
        try {
        tmp = device.createRfcommSocketToServiceRecord(MY_UUID);
        } catch (IOException e) {
        Log.e(this.getClass().getSimpleName(), "create() failed", e);
        }
        mmSocket = tmp;
    }
    public void run() {
        if (DEBUG)
        Log.i(this.getClass().getSimpleName(),
            this.getClass().getName()
                + " ->"
                + Thread.currentThread().getStackTrace()[2]
                    .getMethodName());
        // TODO
        setName("ConnectThread");
        // Always cancel discovery because it will slow down a connection
        mBluetoothAdapter.cancelDiscovery();
        // Make a connection to the BluetoothSocket
        try {
        // This is a blocking call and will only return on a
        // successful connection or an exception
        mmSocket.connect();
        } catch (IOException e) {
        connectionFailed();
        // Close the socket
        try {
            mmSocket.close();
        } catch (IOException e2) {
            Log.e(this.getClass().getSimpleName(),
                "unable to close() socket during connection failure",
                e2);
        }
        return;
        }
        // Reset the ConnectThread because we're done
        synchronized (InterBT.this) {
        mConnectBluetoothThread = null;
        }
        // Start the connected thread
        connected(mmSocket, mmDevice);
    }
    public void cancel() {
        try {
        mmSocket.close();
        } catch (IOException e) {
        Log.e(this.getClass().getSimpleName(),
            "close() of connect socket failed", e);
        }
    }
    }
    public synchronized void connected(BluetoothSocket socket,
        BluetoothDevice device) {
    if (DEBUG)
        Log.d(this.getClass().getSimpleName(), "connected");
    // Cancel the thread that completed the connection
    if (mConnectBluetoothThread != null) {
        mConnectBluetoothThread.cancel();
        mConnectBluetoothThread = null;
    }
    // Cancel any thread currently running a connection
    if (mConnectedBluetoothThread != null) {
        mConnectedBluetoothThread.cancel();
        mConnectedBluetoothThread = null;
    }
    // Cancel the accept thread because we only want to connect to one
    // device
    // if (mAcceptThread != null) {mAcceptThread.cancel(); mAcceptThread =
    // null;}
    // Start the thread to manage the connection and perform transmissions
    mConnectedBluetoothThread = new ConnectionThreadBT(socket);
    mConnectedBluetoothThread.start();
    setState(STATE_CONNECTED);
    }
ConnectionThreadBTまた、読み取りと書き込みの接続を処理する新しいクラスを作成します。
public class ConnectionThreadBT extends ConnectionThreadBase {
    private static final boolean DEBUG = true;
    private final BluetoothSocket mmSocket;
    private final InputStream mmInStream;
    private final OutputStream mmOutStream;
    byte[] responseBuffer = new byte[4096 * 4]; 
    int responseBufferLen = 0;
    public ConnectionThreadBT(BluetoothSocket socket) {
    if (DEBUG)
        Log.i(this.getClass().getSimpleName(),
            this.getClass().getName()
                + " ->"
                + Thread.currentThread().getStackTrace()[2]
                    .getMethodName());
    mmSocket = socket;
    InputStream tmpIn = null;
    OutputStream tmpOut = null;
    // Get the BluetoothSocket input and output streams
    try {
        tmpIn = socket.getInputStream();
        tmpOut = socket.getOutputStream();
    } catch (IOException e) {
        Log.e(this.getClass().getSimpleName(), "temp sockets not created",
            e);
    }
    mmInStream = tmpIn;
    mmOutStream = tmpOut;
   }
    public void run() {
    if (DEBUG)
        Log.i(this.getClass().getSimpleName(),
            this.getClass().getName()
                + " ->"
                + Thread.currentThread().getStackTrace()[2]
                    .getMethodName());
    //we have successfully connected to BT
    //now inform UI 
    Home_Screen.sendMessageToHomeScreen(
        Home_Screen.MESSAGE_INTERBT_CONNECTION_TESTED,
        Home_Screen.CONNECTION_SUCCESS, true);
  }
次に、ConnectionThreadBT内でも定義されているこのメソッドを呼び出すだけで書き込みます
public void sendMsg(MyBuffer buffer){
        try {
        mmOutStream.write(buffer);
        mmOutStream.flush();
        successfullyWritten = true;
        } catch (IOException e) {
        Log.e(this.getClass().getSimpleName(),
            "Exception during write", e);
        successfullyWritten = false;
        }
読み取るには、同じことを行うか、 run メソッドで監視ループを開始します。これは、connectedThread が生きている限り読み取りを続け、UI 画面の更新と同様のハンドラーを介して読み取り情報を報告します。