You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WearOS与Android应用连接异常:仅首次同步有效求助

问题分析与修复

核心问题

你的代码存在三个关键问题,导致计数器仅能首次更新:


1. WearOS端未传递变化的数据内容

Wearable Data Layer的核心机制是仅当DataItem的内容发生实际变化时,才会触发同步事件。你当前的createCounterUpdateDataItem()只创建了路径,没有添加任何可变数据字段:

private fun createCounterUpdateDataItem(): PutDataRequest {
    return PutDataRequest.create("/path").setUrgent()
}

首次发送时,手机端无该路径的数据,因此触发事件;之后每次点击按钮发送的DataItem内容完全一致,Data Layer判定无变化,不会触发新的同步。

2. 手机端监听器存在语法错误

你的手机端监听器lambda表达式有语法错误(dataEvents -缺少>),导致监听器无法正确执行:

dataClient?.addListener { dataEvents -  // 应为dataEvents ->
    // ...
}

同时未在Activity生命周期中管理监听器的注册与注销,可能导致页面重建后监听器失效。

3. 按钮逻辑未区分递增/递减(次要问题)

Forward和Back按钮调用了同一个createCounterUpdateDataItem(),无法实现计数器增减的不同逻辑,导致两个按钮功能完全一致。


修复后的代码示例

WearOS端修改

  1. 在DataItem中添加可变数据(如时间戳或增减指令),确保每次内容不同
  2. 区分Forward/Back按钮的增减逻辑
// 修改数据生成逻辑,添加变化字段
private fun createCounterUpdateDataItem(isIncrement: Boolean): PutDataRequest {
    val dataMap = DataMap().apply {
        // 用时间戳确保每次数据唯一,同时传递增减指令
        putLong("timestamp", System.currentTimeMillis())
        putBoolean("isIncrement", isIncrement)
    }
    return PutDataMapRequest.create("/path")
        .apply { dataMap.putAll(dataMap) }
        .asPutDataRequest()
        .setUrgent()
}

// Forward按钮点击逻辑
@Composable
fun ForwardButton(dataViewModel: DataViewModel) {
    Button(
        onClick = {
            dataViewModel.dataClient?.putDataItem(createCounterUpdateDataItem(true))
            println("ForwardButton clicked")
        }
    ) {
        Text("Vorwärts")
    }
}

// Back按钮点击逻辑
@Composable
fun BackButton(dataViewModel: DataViewModel) {
    Button(
        onClick = {
            dataViewModel.dataClient?.putDataItem(createCounterUpdateDataItem(false))
            println("BackButton clicked")
        }
    ) {
        Text("Zurück")
    }
}

手机端修改

  1. 修复监听器语法错误
  2. 在生命周期中管理监听器的注册/注销
  3. 根据WearOS传递的指令更新计数器
class MainActivity : AppCompatActivity() {

    private var dataClient: DataClient? = null
    private var count = 0
    private lateinit var textView: TextView
    
    // 抽离监听器,方便生命周期管理
    private val dataListener = DataClient.OnDataChangedListener { dataEvents ->
        Log.d("Data Received", "Data received")
        for (event in dataEvents) {
            Log.d("Data Received", event.toString())
            if (event.dataItem.uri.path == "/path") {
                val dataMap = DataMapItem.fromDataItem(event.dataItem).dataMap
                val isIncrement = dataMap.getBoolean("isIncrement")
                count += if (isIncrement) 1 else -1
                updateCounter()
            }
        }
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        dataClient = Wearable.getDataClient(this)
        textView = findViewById(R.id.textView)
        textView.text = count.toString()
    }

    override fun onResume() {
        super.onResume()
        dataClient?.addListener(dataListener)
    }

    override fun onPause() {
        super.onPause()
        dataClient?.removeListener(dataListener)
    }

    private fun updateCounter() {
        runOnUiThread {
            textView.text = count.toString()
        }
    }
}

内容的提问来源于stack exchange,提问作者Jonas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 01:07:46