android - 程序卡在 ObjectInputStream readObject 方法上。

标签 android bluetooth objectoutputstream objectinputstream

当我的代码卡在 objectinputstream readObject() 函数上时,我想在连接建立后共享包含(字符串名称、地址、标题、...和字节 [] 图片)的 Stuff 类型的对象。没有流式传输发生。任何人都可以找出我做错事的地方。

private class ConnectedThread extends Thread {
        private final BluetoothSocket mmSocket;
        private final InputStream mmInStream;
        private final OutputStream mmOutStream;
        private ObjectOutputStream oos = null;
        private ObjectInputStream ois = null;

        public ConnectedThread(BluetoothSocket socket) {
            Log.d(TAG, "create ConnectedThread");
            mmSocket = socket;
            Log.d(TAG, "create a");
            InputStream tmpIn = null;
            Log.d(TAG, "create b");
            OutputStream tmpOut = null;

            // Get the BluetoothSocket input and output streams
            try {
                Log.d("connected thread constructor  before inputstream", "");
                tmpIn = socket.getInputStream();
                Log.d("connected thread constructor  inputstream",
                        tmpIn.toString());
                tmpOut = socket.getOutputStream();
                Log.d("connected thread constructor outputstream",
                        tmpOut.toString());
            } catch (IOException e) {
                Log.e(TAG, "temp sockets not created", e);
            }

            mmInStream = tmpIn;
            mmOutStream = tmpOut;

            final BufferedOutputStream bufo = new BufferedOutputStream(
                    mmOutStream);
            final BufferedInputStream bufi = new BufferedInputStream(mmInStream);

            Log.d(TAG, "attempting to create OOS");

            // ********* ObjectOutputStream **********

            try {
                oos = new ObjectOutputStream(bufo);

            } catch (StreamCorruptedException e) {
                Log.d(TAG, "Caught Corrupted Stream Exception");
                Log.w(TAG, e);

            } catch (IOException e) {
                Log.d(TAG, "Caught IOException");
                Log.w(TAG, e);
            }

            // ********* ObjectInputStream **********

            Thread s = new Thread() {
                public void run() {
                    Log.d(TAG, "attempting to create OIS");
                    try {
                        ois = new ObjectInputStream(bufi);
                    } catch (StreamCorruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    Log.d(TAG, "completed OIS");
                    if (ois == null) {
                        Log.d(TAG, "OIS is null");
                    }
                }

            };
            s.start();

        }

        public void run() {
            Log.i(TAG, "BEGIN mConnectedThread");

我的代码此时挂起,永远不会前进。

        `// Keep listening to the InputStream while connected
        while (true) { 
            try {
                Log.d("Connected thread run ", "start while");

                try {

                    Stuff obj_rcv = (Stuff) ois.readObject();
                    Log.d("BTS", "rcv object " + obj_rcv.getName());

                    Message msg2 = mHandler
                            .obtainMessage(RemoteBusinessCard.MESSAGE_READ);
                    Bundle bundle = new Bundle();
                    bundle.putSerializable("person", obj_rcv);
                    msg2.setData(bundle);
                    mHandler.sendMessage(msg2);

                } catch (ClassNotFoundException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
            } catch (IOException e) {
                Log.e(TAG, "disconnected", e);
                connectionLost();
                break;
            }
        }
    }

    /**
     * Write to the connected OutStream.
     * 
     * @param buffer
     *            The bytes to write
     */
    public void write(Stuff object) {
        try {
            Log.d("BTS", "inside write before" + object.getName());
            oos.writeObject(object);
            Log.d("BTS", "inside write after" + object.getName());
            oos.flush();
            oos.close();

        } catch (IOException e) {
            Log.e(TAG, "Exception during write", e);
        }
    }

    public void cancel() {
        try {
            mmSocket.close();
        } catch (IOException e) {
            Log.e(TAG, "close() of connect socket failed", e);
        }
    }
}`

最佳答案

当你创建一个 ObjectOutputStream 时,你必须确保套接字另一端的 ObjectInputStream 也被适本地创建,因为 outputStream 总是向 inputStream 发送一个确认数据包并阻塞直到它得到答案。

关于android - 程序卡在 ObjectInputStream readObject 方法上。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9148945/

相关文章:

android - 如何在 Android 中获取内存文件的 FileInputStream?该文件位于我在应用程序空间中创建的自定义文件夹中

java - 将 Activity 1 中的值传递给 Activity 2 进行计算并显示结果

java - Android 按钮添加功能

android - Intent.FLAG_ACTIVITY_FORWARD_RESULT Android 中的实时示例

ios - 使用 CoreBluetooth 读取长特征值

ios - 如何在RxBluetoothKit中处理 “Ambiguous reference to member ' = ='”?

android - 为什么有时我的应用程序崩溃?

java.io.EOFException while writing and read from a servlet

java - java ObjectOutputStream 的开销?

java - Java 对象序列化时哪些因素控制文件大小