[Java for Android App Development] liuyang1921:
Hi, Dear XDA-developers,

Recently, I tried to build an blue tooth app. I wanted to display the data in the screen when all data arrived. I used the following code to do that job. However, the looping between Broadcaster receiver and Handler message could not be linked together smoothly. Usually, after one data displayed, I got an error with the following logs

02-03 05:01:30.931: W/dalvikvm(3419): threadid=11: thread exiting with uncaught exception (group=0x40018560)

02-03 05:01:37.827: E/AndroidRuntime(3419): FATAL EXCEPTION: Thread-13

02-03 05:01:37.827: E/AndroidRuntime(3419): java.lang.NullPointerException

02-03 05:01:37.827: E/AndroidRuntime(3419):	at com.huasu.healthmonitor3.Device_Activity$1$2.run(Device_Activity.java:325)

02-03 05:01:37.827: E/AndroidRuntime(3419):	at java.lang.Thread.run(Thread.java:1019)

the code snippet is as followings, any suggestions are appreciated!

public final Handler mHandler = new Handler() {

[MENTION=439709]override[/MENTION]

public void handleMessage(Message msg) {

switch (msg.what) {

case Common.MESSAGE_CONNECT:

new Thread(new Runnable() {

public void run() {

InputStream tmpIn;

OutputStream tmpOut;

try {

UUID uuid = UUID.fromString(SPP_UUID);

BluetoothDevice btDev = btAdapt

.getRemoteDevice(strAddress);

btSocket = btDev

.createRfcommSocketToServiceRecord(uuid);

btSocket.connect();

tmpIn = btSocket.getInputStream();

tmpOut = btSocket.getOutputStream();

} catch (Exception e) {

Log.d(Common.TAG, "Error connected to: "

+ strAddress);

bConnect = false;

mmInStream = null;

mmOutStream = null;

btSocket = null;

e.printStackTrace();

mHandler.sendEmptyMessage(Common.MESSAGE_CONNECT_LOST);

return;

}

mmInStream = tmpIn;

mmOutStream = tmpOut;

mHandler.sendEmptyMessage(Common.MESSAGE_CONNECT_SUCCEED);

}

}).start();

break;

case Common.MESSAGE_CONNECT_SUCCEED:

bConnect = true;

new Thread(new Runnable() {

public void run() {

// First write command to the bluetooth port

try{

mmOutStream.write(comm1);

}

catch (Exception e) {

Log.d(Common.TAG, "Error in writing command to bluetooth ");

}

int nRecv = 0;

while (bConnect) {

try {

Log.e(Common.TAG, "Start Recv" + String.valueOf(mmInStream.available()));

nRecv = mmInStream.read(bufRecv);

if (nRecv < 1) {

Log.e(Common.TAG, "Recving Short");

Thread.sleep(100);

continue;

}

System.arraycopy(bufRecv, 0, bRecv, nRecved, nRecv);

Log.e(Common.TAG, "Recv:" + String.valueOf(nRecv));

nRecved += nRecv;

if(nRecved < nNeed)

{

Thread.sleep(1000);

continue;

}

//sendBroadcast(intent);

mHandler.obtainMessage(Common.MESSAGE_RECV,nNeed, -1, null).sendToTarget();

} catch (Exception e) {

Log.e(Common.TAG, "Recv thread:" + e.getMessage());

mHandler.sendEmptyMessage(Common.MESSAGE_EXCEPTION_RECV);

break;

}

}

Log.e(Common.TAG, "Exit while");

}

}).start();

break;

case Common.MESSAGE_EXCEPTION_RECV:

case Common.MESSAGE_CONNECT_LOST:

try {

if (mmInStream != null)

mmInStream.close();

if (mmOutStream != null)

mmOutStream.close();

if (btSocket != null)

btSocket.close();

} catch (IOException e) {

Log.e(Common.TAG, "Close Error");

e.printStackTrace();

} finally {

mmInStream = null;

mmOutStream = null;

btSocket = null;

bConnect = false;

}

break;

case Common.MESSAGE_WRITE:

break;

case Common.MESSAGE_READ:

break;

case Common.MESSAGE_RECV:

Boolean bOn = false;

if(extr_validate_data())

{

bytesTofloat(bRec_out,3072);

broadcastIntent();

}

case Common.MESSAGE_TOAST:

Toast.makeText(getApplicationContext(),

msg.getData().getString(Common.TOAST),

Toast.LENGTH_SHORT).show();

break;

}

}

};

private BroadcastReceiver connectDevices = new BroadcastReceiver() {

public void onReceive(Context context, Intent intent) {

String action = intent.getAction();

Log.d(Common.TAG, "Receiver:" + action);

update_dis();

mHandler.obtainMessage(Common.MESSAGE_CONNECT_SUCCEED,nNeed, -1, null).sendToTarget();

}

};

public void broadcastIntent()

{

Intent intent = new Intent();

intent.setAction("com.huasu.healthmonitor3.draw");

sendBroadcast(intent);

}