【问题标题】:Issue with syncing data between watch and phone手表和手机同步数据的问题
【发布时间】:2016-12-02 13:44:41
【问题描述】:

我开发了一个 Android 应用程序,它可以同时在智能手机和智能手表上运行。在这两种设备上,(假设)它读取某些传感器数据,处理该数据(计算其平均值),然后存储该结果。手表将此结果发送到手机,因此所有存储都在手机上进行。我使用缓冲区写入器每 5 秒将一个数字写入文本文件。

现在,从手表到手机每交换 320 次数据项后,我手机上的应用程序就会被终止,并且不幸的是,“应用程序的名称”作为消息被停止了。我想不通为什么他们在这个时间之后就停止了?手表上运行的应用程序继续正常工作。但是,我无法存储它的数据,因为它无法与手机版本通信,所以每次手表向手机发送一个数字进行存储时,我都会收到这条消息“不幸的是,该应用程序已作为消息停止”。该应用程序有一个具有服务(前台)的活动。

会不会是对共享的数据量有限制?

手表上的代码:

// Create a data map and put data in it
    private void increaseCounter() {
        PutDataMapRequest putDataMapReq = PutDataMapRequest.create("/count");
        putDataMapReq.getDataMap().putInt(COUNT_KEY, count++); // I add current time here as well
        PutDataRequest putDataReq = putDataMapReq.asPutDataRequest();
        PendingResult<DataApi.DataItemResult> pendingResult =
                Wearable.DataApi.putDataItem(mGoogleApiClient, putDataReq);
    }

手机上的代码(可能有问题的区域):

@Override
    public void onDataChanged(DataEventBuffer dataEvents) {
        for (DataEvent event : dataEvents) {
            if (event.getType() == DataEvent.TYPE_CHANGED) {
                // DataItem changed
                DataItem item = event.getDataItem();
                if (item.getUri().getPath().compareTo("/count") == 0) {
                    DataMap dataMap = DataMapItem.fromDataItem(item).getDataMap();
                    updateCount(dataMap.getInt(COUNT_KEY));
                }
            } else if (event.getType() == DataEvent.TYPE_DELETED) {
                // DataItem deleted
            }
        }
    }

【问题讨论】:

  • 可能您需要禁用某些应用一段时间,检查它们是否停止 160 分钟。并且您的所有应用程序同时停止?
  • 询问自定义 ROM 的作者。 Android 不会定期终止所有应用程序的进程,更不用说让它们崩溃并显示标准的“不幸停止”消息。
  • @Divyesh 我已禁用所有其他应用程序。只有我开发的应用程序正在运行。我的应用程序的所有 12 个版本(12 个应用程序)恰好同时停止。我在最后一周测试了它大约 5 次,它的行为相同。但是,手表上运行的并没有停止。
  • 那么你需要检查你的服务代码。发布您的服务代码之一以了解更多信息9ng
  • 它有超过 1500 行,所以除非我缩小问题区域,否则很难把它放在这里。正如@CommonsWare 所建议的,这可能与 CUSTOM ROM 有关。

标签: android-service listener wear-os android-wear-data-api


【解决方案1】:

您必须将 Service 与 StartForeground 通知一起使用,以确保应用始终正常运行。

并尝试在凝视时使用START_STICKY flag

更新

你必须释放 dataevent 的内存:

  @Override
    public void onDataChanged(DataEventBuffer dataEvents) {

        try{
            for(DataEvent dataEvent: dataEvents){
                if(dataEvent.getType() != DataEvent.TYPE_CHANGED){
                    continue;
                }
////... code

 dataEvents.release();
}catch (Exception e){
            Log.v("SunshineWatchFace",e.getMessage());
        }
    }

【讨论】:

  • 我正在使用 StartForeground 通知。
  • 这里放1500多行太难了。这就是我提出这种行为的原因。
  • 我会尝试使用这个标志来查看它是否会改变行为。我暂时不用。
  • @这不是标志的原因。我从手表发送到手机的金额有问题。
  • @zub12 ,我不知道这些数据是如何存储在操作系统中的:) 恕我直言,wear api 有很多错误
猜你喜欢
  • 1970-01-01
  • 2015-06-04
  • 1970-01-01
  • 1970-01-01
  • 2011-10-30
  • 1970-01-01
  • 2019-09-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多