Я пытаюсь отправить хэш-карту с одного устройства на другое через bluetooth. Я создаю HashMap, как это, и затем вызывая Присоединительные резьбы writeObject
метода:Android bluetooth отправить/получить hashmap
Map<String,String> subInfo = new HashMap<>();
subInfo.put("type", "subInfo");
subInfo.put("num", "1");
BTService.connectedThread.writeObject(subInfo);
Моей служба Bluetooth имеет следующую Thats класс, используемую для обработки передачи данных между устройствами в фоновом потоке:
public static class ConnectedThread extends Thread {
private final BluetoothSocket mmSocket;
private final InputStream mmInStream;
private final OutputStream mmOutStream;
private final ObjectInputStream mmObjInStream;
private final ObjectOutputStream mmObjOutStream;
public ConnectedThread(BluetoothSocket socket) {
mmSocket = socket;
InputStream tmpIn = null;
OutputStream tmpOut = null;
ObjectInputStream tmpObjIn = null;
ObjectOutputStream tmpObjOut = null;
// Get the input and output streams, using temp objects because
// member streams are final
try {
tmpIn = socket.getInputStream();
tmpOut = socket.getOutputStream();
tmpObjIn = new ObjectInputStream(socket.getInputStream());
tmpObjOut = new ObjectOutputStream(socket.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
mmInStream = tmpIn;
mmOutStream = tmpOut;
mmObjInStream = tmpObjIn;
mmObjOutStream = tmpObjOut;
}
public void run() {
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 (!this.isInterrupted()) {
try {
// Read from the InputStream
bytes = mmInStream.read(buffer);
// Send the obtained bytes to the UI activity
mHandler.obtainMessage(Constants.MESSAGE_READ, bytes, -1, buffer)
.sendToTarget();
} catch (IOException e) {
e.printStackTrace();
break;
}
try {
//Read objects from ObjectInputStream
Object object = mmObjInStream.readObject();
// Send the obtained object to the UI activity
mHandler.obtainMessage(Constants.MESSAGE_READ_OBJECT, -1, 0, object)
.sendToTarget();
} catch (ClassNotFoundException | IOException e) {
e.printStackTrace();
}
}
}
/* Call this from the main activity to send data to the remote device */
public void write(byte[] bytes) {
try {
mmOutStream.write(bytes);
} catch (IOException e) {
e.printStackTrace();
}
}
public void writeObject(Object object) {
try {
mmObjOutStream.writeObject(object);
}catch(Exception e){
Log.e(TAG, "Error ObjectOutputStream: " + e.getLocalizedMessage());
}
}
/* Call this from the main activity to shutdown the connection */
public void cancel() {
try {
mmSocket.close();
this.interrupt();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Поэтому, когда я вызываю метод writeObject
, он должен отправить объект вниз по потоку вывода объекта потока выше.
На другом устройстве код аналогичен. Он просто слушает на входе объекта потоке для объекта после того, как было установлено, он посылает MESSAGE_READ_OBJECT
сообщений для моего обработчика сообщений в основной деятельности:
static class MessageHandler extends Handler {
private final WeakReference<MainActivity> mActivity;
MessageHandler(MainActivity activity) {
mActivity = new WeakReference<>(activity);
}
@Override
public void handleMessage(Message msg)
{
final MainActivity mainActivity = mActivity.get();
if (mainActivity == null) {
return;
}
switch(msg.what){
case Constants.MESSAGE_READ_OBJECT:
Object receivedObject = msg.obj;
//How should I pull out the hashmap here?
switch(type){
case "subInfo":
//do some things
break;
}
break;
}
}
}
Что такое правильный путь для сборки HashMap в моем сообщении обработчик? Мне нужно проверить ключ «type» на карте и переключиться на это, но по состоянию на данный момент я не уверен, как вернуть объект карты. receivedObject
объекта в моем обработчике сообщений, кажется, не вести себя как HashMap, и не имеет типичные методы, используемые для вытаскивания ключей и значение
Кроме того, вместо отправки общего Object
через Bluetooth, он будет делать больше смысла напрямую отправлять объект типа Map
?
вы должны преобразовать HashMap в массив байт 'ByteArrayOutputStream byteOut = новый ByteArrayOutputStream(); ObjectOutputStream out = новый ObjectOutputStream (byteOut); out.writeObject (subInfo); ' – SaravInfern