2014-11-19 2 views
3

Я создал приложение. В этом приложении у вас есть объекты, которые содержат 2 строки (имя и возраст) и растровое изображение (аватар). Все сохраняется в базе данных sqlite.Обменивайтесь объектами от телефона до android wear

Теперь я хочу, чтобы эти объекты были доступны на моих умных часах. Поэтому я хочу достичь этого, чтобы начать, запустить приложение и прокрутить влево и вправо, чтобы увидеть эти объекты.

Это означает, что я должен восстановить объекты с телефона и получить их на часах.

В настоящее время я задаюсь вопросом, правильно ли я сделал все, или что я должен делать по-другому. Всякий раз, когда вы запускаете приложение на своих часах, я отправляю запрос на телефон, чтобы я хотел объекты.

private void sendMessage() { 
    if(mGoogleApiClient.isConnected()) { 
     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       NodeApi.GetConnectedNodesResult nodes = Wearable.NodeApi.getConnectedNodes(mGoogleApiClient).await(); 
       for(Node node : nodes.getNodes()) { 
        Wearable.MessageApi.sendMessage(mGoogleApiClient, node.getId(), REQUEST_PET_RETRIEVAL_PATH, null).await(); 
       } 
      } 
     }).start(); 
    } 
} 

По телефону, я получаю это сообщение и отправляет сообщение обратно с объектом.

public void onMessageReceived(MessageEvent messageEvent) { 
    super.onMessageReceived(messageEvent); 

    if (messageEvent.getPath().equals(REQUEST_PET_RETRIEVAL_PATH)) { 


     mGoogleApiClient = new GoogleApiClient.Builder(this) 
       .addConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() { 
        @Override 
        public void onConnected(Bundle connectionHint) { 
         final PutDataMapRequest putRequest = PutDataMapRequest.create("/send-pets"); 
         final DataMap map = putRequest.getDataMap(); 

         File imgFile = new File(obj.getAvatar()); 

         Bitmap avatar; 
         if(imgFile.exists()) { 
          avatar = BitmapFactory.decodeFile(imgFile.getAbsolutePath()); 
         } else { 
          avatar = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher); 
         } 

         Asset asset = createAssetFromBitmap(avatar); 
         map.putAsset("avatar", asset); 
         map.putString("name", obj.getName()); 
         map.putString("age", obj.getDateOfBirth()); 
         Wearable.DataApi.putDataItem(mGoogleApiClient, putRequest.asPutDataRequest()); 
        } 

        @Override 
        public void onConnectionSuspended(int cause) { 
        } 
       }) 
       .addOnConnectionFailedListener(new GoogleApiClient.OnConnectionFailedListener() { 
        @Override 
        public void onConnectionFailed(ConnectionResult result) { 
        } 
       }) 
       .addApi(Wearable.API) 
       .build(); 
     mGoogleApiClient.connect(); 
    } 

На часах я получаю объект.

public void onDataChanged(DataEventBuffer dataEvents) { 
    final List<DataEvent> events = FreezableUtils.freezeIterable(dataEvents); 
    for(DataEvent event : events) { 
     final Uri uri = event.getDataItem().getUri(); 
     final String path = uri!=null ? uri.getPath() : null; 
     if("/send-pets".equals(path)) { 
      final DataMap map = DataMapItem.fromDataItem(event.getDataItem()).getDataMap(); 
      String name = map.getString("name"); 
      String age = map.getString("age"); 

      Asset avatar = map.getAsset("avatar"); 
      Bitmap bitmap = loadBitmapFromAsset(avatar); 
     } 
    } 
} 

Теперь я застрял с 2 вопроса:

1) Является ли это путь или я должен решить по-другому?

2) Возможно ли послать сразу несколько объектов или мне просто нужно поместить цикл вокруг детали в метод onConnected и отправить каждый объект отдельно?

ответ

2

Да, этот подход является хорошим и правильным.

Да, вы можете отправить несколько, но вы должны знать, что они не «отправляют», они больше похожи на общие или синхронизированные между телефоном и Wear и могут быть изменены в любой момент времени (однако я бы рекомендуем сохранить их в SharedPreferences на Wear, чтобы иметь доступ к ним в автономном режиме.

Так Message API отправляет объекты (быстро и просто), а DataItem API более сложный, но используется для больших данных и обмена вещами между часами и телефоном.

+0

Спасибо за подтверждение :) –

+0

Что произойдет, если я хочу отправить пользовательский объект, содержащий три других пользовательских объекта? Должен ли я помещать на карту каждое отдельное поле объекта отдельно? –

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