我正在尝试以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解析一个字符串,但我不知道这是否也是低效的。
答案 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对象,并将数据放入ArrayList
个Item
个对象中。
@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
AsyncTask
个ArrayList
个对象,并使用自己的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