I've read a ton of SO threads on this and im still confused. I need to send a ship object, for a battleships game. I've made the ship class implement serializable, but I can't seem to send the object. I've basically just used code I've found online and incorparated it into my code for connectedThread (same as android dev site). Code is below. Can anyone tell me where I'm going wrong, any help is greatly appreciated. I get errors when i run the code, which seem to be coming from the objectinputstream side
public class ConnectedThread extends Thread {
private final BluetoothSocket mmSocket;
private final InputStream mmInStream;
private final OutputStream mmOutStream;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
private ObjectOutput out = null;
byte[] yourBytes = new byte[1024];
public ConnectedThread(BluetoothSocket socket) {
Log.d(TAG, "connectedthread started");
// mHandler.obtainMessage(TEST).sendToTarget();
mmSocket = socket;
InputStream tmpIn = null;
OutputStream tmpOut = null;
yourBytes = null;
// Get the input and output streams, using temp objects because
// member streams are final
try {
tmpIn = socket.getInputStream();
tmpOut = socket.getOutputStream();
out = new ObjectOutputStream(bos);
} catch (IOException e) {
Log.e(TAG, "temp sockets not created");
}
mmInStream = tmpIn;
mmOutStream = tmpOut;
}
public void run() {
Log.i(TAG, "Begin mConnectedThread");
byte[] buffer = new byte[1024]; // buffer store for the stream
int bytes; // bytes returned from read()
// Keep listening to the InputStream until an exception occurs
while (true) {
try {
// Read from the InputStream
bytes = mmInStream.read(buffer);
// Send the obtained bytes to the UI activity
Log.i(TAG, "reaaaad msg");
mHandler.obtainMessage(SetUpGame.MESSAGE_READ2, bytes,
-1, buffer).sendToTarget();
Log.i(TAG, "READ OBJECT");
// ........................................THIS IS CODE THAT HAS ERRORS-----------
ByteArrayInputStream bis = new ByteArrayInputStream(yourBytes);
ObjectInput in = null;
try {
in = new ObjectInputStream(mmInStream);
Ship yourObject = (Ship) in.readObject();
//Log.i("Object received maybe", yourObject.toString());
if(yourObject!=null)
mHandler.obtainMessage(SetUpGame.MESSAGE_READ_OBJ, -1, -1, yourObject).sendToTarget();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
bis.close();
in.close();
}
// -----------------------------------IF I DELETE THE ABOVE CODE IT WORKS FOR STRINGS PERFECTLY------
}
catch (IOException e) {
Log.e(TAG, "disconnectd");
break;
}
}
}
/*
* Call this from the main activity to send data to the remote device
*/
public void write(byte[] buffer) {
try {
mmOutStream.write(buffer);
Log.i(TAG, "writeeee msg");
mHandler.obtainMessage(SetUpGame.MESSAGE_WRITE, -1, -1, buffer)
.sendToTarget();
} catch (IOException e) {
Log.e(TAG, "Exception during write");
}
}
public void writeObj(Ship ship) {
bos = new ByteArrayOutputStream();
ObjectOutput out = null;
try {
out = new ObjectOutputStream(mmOutStream);
out.writeObject(ship);
yourBytes = bos.toByteArray();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/* Call this from the main activity to shutdown the connection */
public void cancel() {
try {
mmSocket.close();
out.close();
bos.close();
} catch (IOException e) {
Log.e(TAG, "close of connect socket failed");
}
}
}
and logcat:
03-21 02:41:41.594: E/AndroidRuntime(12529): java.lang.NullPointerException
03-21 02:41:41.594: E/AndroidRuntime(12529): at java.io.ByteArrayInputStream.<init>(ByteArrayInputStream.java:58)
03-21 02:41:41.594: E/AndroidRuntime(12529): at com.example.battleships.v2.ChatService$ConnectedThread.run(ChatService.java:280)
03-21 02:41:41.875: E/ActivityThread(12529): Activity com.example.battleships.v2.MainScreen has leaked IntentReceiver com.example.battleships.v2.MainScreen$2@40521320 that was originally registered here. Are you missing a call to unregisterReceiver()?
03-21 02:41:41.875: E/ActivityThread(12529): android.app.IntentReceiverLeaked: Activity com.example.battleships.v2.MainScreen has leaked IntentReceiver com.example.battleships.v2.MainScreen$2@40521320 that was originally registered here. Are you missing a call to unregisterReceiver()?
03-21 02:41:41.875: E/ActivityThread(12529): at android.app.LoadedApk$ReceiverDispatcher.<init>(LoadedApk.java:799)
03-21 02:41:41.875: E/ActivityThread(12529): at android.app.LoadedApk.getReceiverDispatcher(LoadedApk.java:575)
03-21 02:41:41.875: E/ActivityThread(12529): at android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:865)
03-21 02:41:41.875: E/ActivityThread(12529): at android.app.ContextImpl.registerReceiver(ContextImpl.java:852)
03-21 02:41:41.875: E/ActivityThread(12529): at android.app.ContextImpl.registerReceiver(ContextImpl.java:846)
03-21 02:41:41.875: E/ActivityThread(12529): at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:318)
03-21 02:41:41.875: E/ActivityThread(12529): at com.example.battleships.v2.MainScreen.setUpUI(MainScreen.java:167)
03-21 02:41:41.875: E/ActivityThread(12529): at com.example.battleships.v2.MainScreen.onCreate(MainScreen.java:160)
03-21 02:41:41.875: E/ActivityThread(12529): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1072)
03-21 02:41:41.875: E/ActivityThread(12529): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1836)
03-21 02:41:41.875: E/ActivityThread(12529): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1893)