title: How to solve delay in Inputstream.read() in android?
body: <p>I am working on a Bluetooth multiplayer game project.I followed the android Bluetooth overview <a href="https://developer.android.com/guide/topics/connectivity/bluetooth" rel="nofollow noreferrer">https://developer.android.com/guide/topics/connectivity/bluetooth</a> strictly.I used the following code to read and write data:-</p>
  
  <pre><code>public class MyBluetoothService {
  private static final String TAG = "MY_APP_DEBUG_TAG";
  private Handler handler; // handler that gets info from Bluetooth service
  
  // Defines several constants used when transmitting messages between the
  // service and the UI.
  private interface MessageConstants {
      public static final int MESSAGE_READ = 0;
      public static final int MESSAGE_WRITE = 1;
      public static final int MESSAGE_TOAST = 2;
  
      // ... (Add other message types here as needed.)
  }
  
  private class ConnectedThread extends Thread {
      private final BluetoothSocket mmSocket;
      private final InputStream mmInStream;
      private final OutputStream mmOutStream;
      private byte[] mmBuffer; // mmBuffer store for the stream
  
      public ConnectedThread(BluetoothSocket socket) {
          mmSocket = socket;
          InputStream tmpIn = null;
          OutputStream tmpOut = null;
  
          // Get the input and output streams; using temp objects because
          // member streams are final.
          try {
              tmpIn = socket.getInputStream();
          } catch (IOException e) {
              Log.e(TAG, "Error occurred when creating input stream", e);
          }
          try {
              tmpOut = socket.getOutputStream();
          } catch (IOException e) {
              Log.e(TAG, "Error occurred when creating output stream", e);
          }
  
          mmInStream = tmpIn;
          mmOutStream = tmpOut;
      }
  
      public void run() {
          mmBuffer = new byte[1024];
          int numBytes; // bytes returned from read()
  
          // Keep listening to the InputStream until an exception occurs.
          while (true) {
              try {
                  // Read from the InputStream.
                  numBytes = mmInStream.read(mmBuffer);
                  // Send the obtained bytes to the UI activity.
                  Message readMsg = handler.obtainMessage(
                          MessageConstants.MESSAGE_READ, numBytes, -1,
                          mmBuffer);
                  readMsg.sendToTarget();
              } catch (IOException e) {
                  Log.d(TAG, "Input stream was disconnected", e);
                  break;
              }
          }
      }
  
      // Call this from the main activity to send data to the remote device.
      public void write(byte[] bytes) {
          try {
              mmOutStream.write(bytes);
  
              // Share the sent message with the UI activity.
              Message writtenMsg = handler.obtainMessage(
                      MessageConstants.MESSAGE_WRITE, -1, -1, mmBuffer);
              writtenMsg.sendToTarget();
          } catch (IOException e) {
              Log.e(TAG, "Error occurred when sending data", e);
  
              // Send a failure message back to the activity.
              Message writeErrorMsg =
                      handler.obtainMessage(MessageConstants.MESSAGE_TOAST);
              Bundle bundle = new Bundle();
              bundle.putString("toast",
                      "Couldn't send data to the other device");
              writeErrorMsg.setData(bundle);
              handler.sendMessage(writeErrorMsg);
          }
      }
  
      // Call this method from the main activity to shut down the connection.
      public void cancel() {
          try {
              mmSocket.close();
          } catch (IOException e) {
              Log.e(TAG, "Could not close the connect socket", e);
          }
      }
   }
  }
  </code></pre>
  
  <p>For writing data I am using the following code:-</p>
  
  <pre><code>String[] myString={"HI!","How Are YOU"};
  mConnected.write(Arrays.toString(myString).getBytes());
  </code></pre>
  
  <p>But I see that inputstream.read() is receiving data quite late after another device is sending the data.I found some questions regarding this,but none of them seem to provide a satisfactory answer.Any suggestion will be highly helpful.</p>