将JSON数据提供给可穿戴设备的有效方法

时间:2015-10-29 13:06:01

标签: android json gson wear-os android-wear-data-api

我正在尝试以JSON对象的形式从URL读取提要,并将该提要传递给可穿戴设备,以使用Data API显示为列表。此JSON对象包含一个对象数组,每个对象包含一些元素。像这样:

{ "items":[
    { "title":"item 1", "element_1":"element 1", "element_2":"element 2" }
    { "title":"item 2", "element_1":"element 1", "element_2":"element 2" }
    { "title":"item 3", "element_1":"element 1", "element_2":"element 2" }
]}

我可以使用GSON或Jackson(尽管我认为我更喜欢GSON)将这些项目放入ArrayList个对象中,但我不知道如何能够使用ArrayList个对象对可穿戴者。据我所知,我做不到。我想知道是否有办法做到这一点,或者如果没有,是否有某种最佳实践可以解决这个问题?我应该将JSON作为字符串,将字符串传递给可穿戴设备,然后解析它吗?我不知道如果字符串非常大,这是否效率低,考虑到我不知道JSON对象列表有多大。另外我知道可以用GSON解析一个字符串,但我不知道这是否也是低效的。

2 个答案:

答案 0 :(得分:1)

一般建议是向可穿戴设备发送所需的最低数据,并在手持设备上进行最大处理,因为它具有更强大的处理能力(和电池)。
根据文件: https://developers.google.com/android/reference/com/google/android/gms/wearable/DataItem.html#setData(byte[])
当前最大数据项大小限制大约为100k。数据项通常应远小于此限制。
您应该做出决定,如果这符合您的需求 - 如果可以接收非常大的JSON,也许您可​​以在手持设备端拆分它,或者您可以过滤其中的一些数据。

如果您认为这不适合您的情况,那么也许您应该修改您的要求!

我正在使用GSON直接在可穿戴设备上处理JSON,对于我的用例,它已经足够好了。

答案 1 :(得分:1)

我找到了Android Wear Sample XYZTouristAttractions,这是我当前基于该示例的代码。首先,我创建了一个共享库来减少重复代码。此共享库包含保存JSON数据的Item类。我在掌上电脑的DownloadArrayListTask中使用此类,它从输入流中获取JSON对象,并将数据放入ArrayListItem个对象中。

@Override
protected ArrayList<Item> doInBackground(URL... params) {
    URL url = params[0];
    ArrayList<Item> items = new ArrayList<>();

    try {
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        try {
            InputStreamReader input = new InputStreamReader(connection.getInputStream());

            Type listType = new TypeToken<Map<String, ArrayList<Item>>>(){}.getType();
            Gson gson = new GsonBuilder().create();
            Map<String, ArrayList<Item>> treeMap = gson.fromJson(input, listType);
            items = treeeMap.get("items");

            input.close();
        } finally {
            connection.disconnect();
        }
    } catch (IOException exception) {
        exception.printStackTrace();
    }

    return items
}

ArrayList分为DataLayerListenerService中的字符串,并放置在ArrayList DataMap@Override public void onMessageReceived(MessageEvent messageEvent) { GoogleApiClient googleApiClient = new GoogleApiClient.Builder(this) .addApi(Wearable.API).build(); ConnectionResult connectionResult = googleApiClient.blockingConnect(30, TimeUnit.SECONDS); if(!connectionResult.isSuccess()) { Log.e(TAG, "Failed to connect to Google API Client"); return; } if(messageEvent.getPath().equals("/update_path") { ArrayList<Item> items = new ArrayList<>() try { items = new DownloadArrayListTask().execute(new URL("http://my_url")).get(); } catch (MalformedURLException | InterruptedException | ExecutionException exception) { exception.printStackTrace(); } ArrayList<DataMap> itemMaps = new ArrayList<>(items.size()); for(Item item : items) { DataMap dataMap = new DataMap(); dataMap.putString("title", item.getTitle()); dataMap.putString("element1", item.getElement1()); dataMap.putString("element2", item.getElement2()); itemMaps.add(dataMap); } new Thread(new Runnable() { @Override public void run() { NodeApi.GetConnectedNodesResult nodes = Wearable.NodeApi.getConnectedNodes(googleApiClient).await(); for(Node node : nodes.getNodes()) { PutDataMapRequest dataMapRequest = PutDataMapRequest.create("/item_path"); dataMapRequest.getDataMap().putDataMapArrayList("item_key", itemMaps); PutDataRequest request = dataMapRequest.asPutDataRequest(); DataApi.DataItemResult result = Wearable.DataApi.putDataItem(googleApiClient, request).await(); if(!result.getStatus().isSuccess()) { Log.d(TAG, "Failed to send data"); } } } }).start(); } } 个对象中供可穿戴者接收。

ArrayList

然后,可穿戴设备会收到DataMap AsyncTaskArrayList个对象,并使用自己的Item将它们放回@Override protected ArrayList<Item> doInBackground(Uri... params) { Uri uri = params[0]; ArrayList<Item> items = new ArrayList<>(); GoogleApiClient googleApiClient = new GoogleApiClient.Builder(this) .addApi(Wearable.API).build(); ConnectionResult connectionResult = googleApiClient.blockingConnect(30, TimeUnit.SECONDS); if(!connectionResult.isSuccess()) { Log.e(TAG, "Failed to connect to Google API Client"); return; } DataItemBuffer results = Wearable.DataApi.getDataItems(googleApiClient).await(); if(results.getStatus().isSuccess() && results.getCount() != 0) { DataMapItem dataMapItem = DataMapItem.fromDataItem(results.get(0); List<DataMap> data = dataMapItem.getDataMap().getDataMapArrayList("item_key"); for(DataMap dataItem : data) { Item item = new Item(dataItem.getString("title"), dataItem.getString("element1"), dataItem.getString("element2")); items.add(item); } } else { Log.d(TAG, "Failed to obtain data"); } return items; } @个对象中。

SQLPLUS login/password@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(Host=<url>)(Port=<port>))(CONNECT_DATA=(SID=<sid>))) @C:\Users\Documents\SQL\test2.sql