1

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)
4

1 回答 1

0

看起来您已经通过在方法 writeObj() 中重新声明它来覆盖类变量“out”。删除“ObjectOutput out = null;” 来自 writeObj()。

此外,当您不断重置类变量“bos”时,您似乎有点不确定要写入哪个流。

您可能会收到 NullPointerException 异常,因为您正试图以您认为的方式使用不在范围内的变量。

于 2013-03-21T03:16:50.600 回答