Android BLE API methods for reading some characteristics are Asynchronous in nature and when you request some value, your GATT callback method is called.
If you request multiple read characteristics values it just simply discards others until it doesn't entertained the first request.
I didn't understand if that so why they made methods Async. If someone know which design pattern we should adapt to solve this problem please share.
If you want to read some characteristics then you have to request it.
// new value available will be notified in Callback Object
mBluetoothGatt.readCharacteristic(ch);
GATT callback
public void onCharacteristicRead(BluetoothGatt gatt, android.bluetooth.BluetoothGattCharacteristic characteristic, int status)
Possible Solution # 1
https://code.google.com/p/guava-libraries/wiki/ListenableFutureExplained
Anyone can explain how to use this . I think this will help in this case but I am still looking how to use it.
Possible Solution # 2
https://code.google.com/p/mobility-rpc/source/browse/mobility-rpc/trunk/src/main/java/com/googlecode/mobilityrpc/session/impl/MobilitySessionImpl.java#395
Possible Solution # 3
http://tutorials.jenkov.com/java-util-concurrent/synchronousqueue.html
Possible Solution # 4
http://examples.javacodegeeks.com/core-java/util/concurrent/synchronous-queue-example-to-execute-commands/
Possible Solution # 5
https://stackoverflow.com/a/15816566/185022
Update
I have managed to make it work with a Queue preferabley SynchronousQueue but I'll share my final solution after testing. Specify a timeout otherwise it will get stuck or if you request some read of characteristics that don't support read operation.
You can see which characteristics are readable writeable notifiable see this post