通过android上的蓝牙发送对象,我如何serialise对象和发送?

通过android上的蓝牙发送对象,我如何serialise对象和发送?

问题描述:

我已经读了大量的SO线程,我仍然困惑。我需要发送一个舰船对象,用于战列舰游戏。我已经将ship类实现为可序列化的,但我似乎无法发送该对象。我基本上只使用了我在网上找到的代码,并将它合并到我的connectedThread代码中(与android dev站点相同)。代码如下。任何人都可以告诉我哪里出错了,非常感谢任何帮助。我得到的错误,当我运行的代码,这似乎是从ObjectInputStream的侧通过android上的蓝牙发送对象,我如何serialise对象和发送?

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 [email protected] 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 [email protected] 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) 
+0

请更新您的帖子以包含您所得到的错误的描述。 – 2013-03-21 02:31:05

+0

我添加了一些我得到的错误,并明确了哪一部分给了我代码中的错误。如果我删除该代码,它适用于字符串。另外,我对logcat错误的格式表示歉意。谢谢 – user1953208 2013-03-21 02:57:20

看起来你已经被重新声明它覆盖了类变量“走出去”在writeObj()方法内部。删除“ObjectOutput out = null;”来自writeObj()。

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

您可能会遇到NullPointerException,因为您正在尝试使用不在您认为的范围内的变量。

+0

嗯,我会稍后再玩一下代码,但我很困惑于通过蓝牙发送对象。最糟糕的是我找不到类似项目的任何工作示例或解释它的任何资源,就像我5 lol。谢谢你的时间寿! – user1953208 2013-03-21 17:42:48