2016-06-07 2 views
1

Я пытаюсь отправить хэш-карту с одного устройства на другое через 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?

+0

вы должны преобразовать HashMap в массив байт 'ByteArrayOutputStream byteOut = новый ByteArrayOutputStream(); ObjectOutputStream out = новый ObjectOutputStream (byteOut); out.writeObject (subInfo); ' – SaravInfern

ответ

0
+0

Итак, я пробовал это:' HashMap receivedObject = (HashMap) msg.obj; '' String type = receivedObject.get ("type"); 'но студия android дает мне ошибка о несовместимых типах. Переменная 'type' должна быть строкой (потому что это то, что я вложил в хэш-файл в первую очередь), но он говорит, что обнаружил, что« Object » – Simon

+0

использует этот код: HashMap mHashmap = (HashMap ) msg.obj; – user998953

Смежные вопросы