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

Honeywell EDA51安卓应用TextChanged事件多次触发问题排查

问题分析与解决方案

TextChanged事件多次触发的原因

  1. 事件本身特性:TextChanged会在输入框文本发生任何微小变化时触发——包括手动输入单个字符、扫描器快速逐字符填充文本、系统自动修正(如大小写转换)等,扫描器快速连续输入字符自然会触发多次事件。
  2. 扫描器输出机制:Honeywell EDA51默认可能会逐字符推送扫描结果,而非一次性输出完整条码,导致事件连续触发。部分设备还会自动追加回车/换行符,额外触发一次事件。
  3. 控制逻辑漏洞:手动用controlValue控制时,若未处理扫描的连续输入、线程同步问题,可能导致逻辑混乱,甚至引发设备无响应。

解决方法

方案1:添加防抖机制(适配TextChanged场景)

利用扫描输入速度远快于手动输入的特点,设置延迟定时器,短时间内的多次触发只执行最后一次处理逻辑,避免重复执行。

XAML代码

<Entry x:Name="BoxCodeEntry" Placeholder="输入箱码" TextChanged="BoxCode_TextChanged" />
<Entry x:Name="ProductCodeEntry" Placeholder="输入产品码" TextChanged="ProductCode_TextChanged" />

C#防抖处理代码

private Timer _boxCodeDebounceTimer;
private Timer _productCodeDebounceTimer;
private const int DebounceDelay = 150; // 可根据设备扫描速度调整(单位:ms)
private string _currentBoxCode;

private void BoxCode_TextChanged(object sender, TextChangedEventArgs e)
{
    // 清除之前的定时器,避免重复执行
    _boxCodeDebounceTimer?.Dispose();
    _boxCodeDebounceTimer = new Timer(async _ =>
    {
        await MainThread.InvokeOnMainThreadAsync(() =>
        {
            var boxCode = BoxCodeEntry.Text?.Trim();
            if (!string.IsNullOrEmpty(boxCode))
            {
                _currentBoxCode = boxCode;
            }
        });
    }, null, DebounceDelay, Timeout.Infinite);
}

private void ProductCode_TextChanged(object sender, TextChangedEventArgs e)
{
    _productCodeDebounceTimer?.Dispose();
    _productCodeDebounceTimer = new Timer(async _ =>
    {
        await MainThread.InvokeOnMainThreadAsync(() =>
        {
            var productCode = ProductCodeEntry.Text?.Trim();
            // 仅当箱码和产品码都有效时执行配对存储
            if (!string.IsNullOrEmpty(productCode) && !string.IsNullOrEmpty(_currentBoxCode))
            {
                SaveBoxProductPair(_currentBoxCode, productCode);
                ProductCodeEntry.Text = string.Empty; // 清空产品码输入框,方便下一次输入
            }
        });
    }, null, DebounceDelay, Timeout.Infinite);
}

// 配对存储逻辑示例(异步处理避免UI阻塞)
private void SaveBoxProductPair(string boxCode, string productCode)
{
    Task.Run(() =>
    {
        // 替换为你的实际存储逻辑:如SQLite写入、本地文件存储等
        // 示例:
        // var pair = new BoxProductPair { BoxCode = boxCode, ProductCode = productCode, CreateTime = DateTime.Now };
        // await _dbContext.BoxProductPairs.AddAsync(pair);
        // await _dbContext.SaveChangesAsync();
    });
}

// 页面销毁时清理定时器,避免内存泄漏
protected override void OnDisappearing()
{
    base.OnDisappearing();
    _boxCodeDebounceTimer?.Dispose();
    _productCodeDebounceTimer?.Dispose();
}

方案2:直接监听Honeywell扫描器硬件事件(更可靠)

绕过输入框的TextChanged,使用Honeywell官方Data Collection SDK直接监听扫描事件,扫描结果一次性获取,彻底解决多次触发问题,同时不影响手动输入。

C#核心代码

private BarcodeReader _barcodeReader;

protected override void OnAppearing()
{
    base.OnAppearing();
    // 初始化扫描器
    _barcodeReader = new BarcodeReader();
    _barcodeReader.BarcodeDataReceived += OnBarcodeScanned;
    _barcodeReader.StartScanning();
}

private void OnBarcodeScanned(object sender, BarcodeDataEventArgs e)
{
    var scannedCode = e.BarcodeData.Text;
    MainThread.BeginInvokeOnMainThread(() =>
    {
        // 根据当前焦点分配扫描结果到对应输入框
        if (BoxCodeEntry.IsFocused)
        {
            BoxCodeEntry.Text = scannedCode;
            _currentBoxCode = scannedCode;
        }
        else if (ProductCodeEntry.IsFocused)
        {
            ProductCodeEntry.Text = scannedCode;
            if (!string.IsNullOrEmpty(_currentBoxCode))
            {
                SaveBoxProductPair(_currentBoxCode, scannedCode);
                ProductCodeEntry.Text = string.Empty;
            }
        }
    });
}

protected override void OnDisappearing()
{
    base.OnDisappearing();
    // 停止扫描并释放资源
    _barcodeReader?.StopScanning();
    _barcodeReader?.Dispose();
}

额外优化建议

  1. 调整扫描器输出设置:在EDA51的设备设置中,将扫描器的输出模式改为「一次性发送完整条码」,关闭自动追加回车/换行符的选项,减少不必要的文本变化。
  2. 避免UI线程耗时操作:所有存储、网络请求等耗时逻辑必须异步执行,防止UI线程阻塞导致设备无响应。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 13:45:52