通过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)
答
看起来你已经被重新声明它覆盖了类变量“走出去”在writeObj()方法内部。删除“ObjectOutput out = null;”来自writeObj()。
此外,当您不断重置类变量“bos”时,您似乎还不确定要写入哪个流。
您可能会遇到NullPointerException,因为您正在尝试使用不在您认为的范围内的变量。
+0
嗯,我会稍后再玩一下代码,但我很困惑于通过蓝牙发送对象。最糟糕的是我找不到类似项目的任何工作示例或解释它的任何资源,就像我5 lol。谢谢你的时间寿! – user1953208 2013-03-21 17:42:48
请更新您的帖子以包含您所得到的错误的描述。 – 2013-03-21 02:31:05
我添加了一些我得到的错误,并明确了哪一部分给了我代码中的错误。如果我删除该代码,它适用于字符串。另外,我对logcat错误的格式表示歉意。谢谢 – user1953208 2013-03-21 02:57:20