通过数据层同步进行通信

Communication through Data Layer synchronization

我正在开发一个应用程序,该应用程序具有佩戴端和手持端。该应用程序旨在在没有手持端的情况下工作,并在两侧连接时同步获取的数据。现在我在手持端有一项服务正在监听 googleclientAPI,而在穿戴端我有一项服务可以获取 GPS 数据并将每个坐标都放在 googleclientAPI 上。当我 运行 磨损端(没有手持设备连接)时,应用程序会根据需要将所有数据添加到 googleclientAPI。

问题是,当我连接两侧(通过蓝牙)时,手持端仅接收添加到 googleClientAPI 的最后一个数据映射...

磨损面:

private void addLocationEntry(double latitude, double longitude, float accuracy, long gpsTime, float speed, double altitude, long time){
    String PATH = "/TuneWear/GPSdata";

    if(!googleClient.isConnected()){
        return;
    }

    String path = PATH + "/" + time;
    PutDataMapRequest putDataMapRequest = PutDataMapRequest.create(path);

    putDataMapRequest.getDataMap().putLong(KEY_GPSTIME, gpsTime);
    putDataMapRequest.getDataMap().putLong(KEY_TIME, time);
    putDataMapRequest.getDataMap().putDouble(KEY_LATITUDE, latitude);
    putDataMapRequest.getDataMap().putDouble(KEY_LONGITUDE, longitude);
    putDataMapRequest.getDataMap().putFloat(KEY_SPEED, speed);
    putDataMapRequest.getDataMap().putFloat(KEY_DISTANCE, distance);
    putDataMapRequest.getDataMap().putFloat(KEY_ACCURACY, accuracy);
    putDataMapRequest.getDataMap().putDouble(KEY_ALTITUDE, altitude);

    PutDataRequest request = putDataMapRequest.asPutDataRequest();

    Wearable.DataApi.putDataItem(googleClient, request);

    mCalendar.setTimeInMillis(System.currentTimeMillis());
}

手持端:

@Override
public void onDataChanged(DataEventBuffer dataEventBuffer) {
    for (DataEvent event : dataEventBuffer) {
        if (event.getType() == DataEvent.TYPE_CHANGED) {
            // DataItem changed
            DataItem item = event.getDataItem();
            //Log.d(TAG, "DataItem RECEIVED: " + item.getUri().getPath());
            if (item.getUri().getPath().contains(PATH + "/")) {
                DataMap dataMap = DataMapItem.fromDataItem(item).getDataMap();
                Log.d(TAG, "DataItem " + item.getUri().getPath() + " changed: GPSTimestamp " + dataMap.getLong(KEY_GPSTIME) + " Time: " + dataMap.getLong(KEY_TIME) +
                        " LAT " + dataMap.getDouble(KEY_LATITUDE) + " LONG " + dataMap.getDouble(KEY_LONGITUDE) + " Speed: " + dataMap.getFloat(KEY_SPEED) +
                        " Distance: " + dataMap.getFloat(KEY_DISTANCE) + " Accuracy: " + dataMap.getFloat(KEY_ACCURACY) + " Altitude: " + dataMap.getDouble(KEY_ALTITUDE));


                String headerString = "GPSTimestamp\tPhoneTimestamp\tLatitude\tLongitude\tSpeed\tDistance\tAccuracy\tAltitude\n";
                String dataPath = Environment.getExternalStorageDirectory().toString() + "/TuneWear/";
                String dataString = dataMap.getLong(KEY_GPSTIME) + "\t" + dataMap.getLong(KEY_TIME) + "\t" + dataMap.getDouble(KEY_LATITUDE) + "\t" +
                        dataMap.getDouble(KEY_LONGITUDE) + "\t" + dataMap.getFloat(KEY_SPEED) + "\t" + dataMap.getFloat(KEY_DISTANCE) + "\t" + dataMap.getFloat(KEY_ACCURACY) +
                        "\t" + dataMap.getDouble(KEY_ALTITUDE) + "\n";

                File myDir = new File(dataPath + PATH);
                myDir.mkdirs();

                File file = new File(myDir, "data.txt");
                Log.i("FILE", "FILE: " + file.getPath());
                try {
                    FileOutputStream out = new FileOutputStream(file, true);
                    if(file.length() == 0){
                        out.write(headerString.getBytes());
                    }
                    out.write(dataString.getBytes());
                    out.close();
                }
                catch (IOException e) {
                    Log.e("Exception", "File write failed: " + e.toString());
                }
                Log.i("FILE", "FILE Changed!!! ");
            }
        } else if (event.getType() == DataEvent.TYPE_DELETED) {
            // DataItem deleted
            Log.d(TAG, "DataItem deleted: " + event.getDataItem().getUri());
        }
        //Wearable.DataApi.deleteDataItems(mGoogleApiClient, event.getDataItem().getUri(), DataApi.FILTER_PREFIX);

    }
}

如何让所有数据同步?

如果您使用相同的 "time",这意味着您的数据项都具有相同的确切路径,那么每次添加都会更新旧数据,因此您最终只会得到一条记录(最后一条) .如果您希望所有内容都单独可用,请确保它们的路径是唯一的(例如,在您的路径中使用时间戳)。