1

私はこれについてたくさんのSOスレッドを読みましたが、まだ混乱しています。戦艦ゲームのために、船オブジェクトを送信する必要があります。ship クラスをシリアライズ可能に実装しましたが、オブジェクトを送信できないようです。私は基本的に、オンラインで見つけたコードを使用して、connectedThread のコードに組み込みました (Android 開発サイトと同じ)。コードは以下です。どこが間違っているのか誰にでも教えてもらえますか?どんな助けでも大歓迎です。コードを実行するとエラーが発生しますが、これは objectinputstream 側から来ているようです

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");
        }
    }

}

および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 に答える