【问题标题】:Xamarin Forms Entry throwing Java.Lang.ArrayIndexOutOfBoundsExceptionXamarin 表单条目抛出 Java.Lang.ArrayIndexOutOfBoundsException
【发布时间】:2016-10-14 09:34:00
【问题描述】:

当调用 OnTextChanged 事件时,我正在使用 Xamarin Forms 的 Entry 检索一些数据。

有时,它会抛出无法捕获的Java.Lang.ArrayIndexOutOfBoundsException,从而导致应用程序崩溃。

我使用的代码是:

private void textbox_OnTextChanged(object sender, TextChangedEventArgs e)
{
     TextChanged();
}

public async void TextChanged()
{
     try
     {
         if(textbox.Text.Length > 5) //< This sucks and I know it. 
         {
             string text = textbox.Text;
             await Task.Run(()=>doSomeMadlyDemandingRandomStuff(text));
         }
     }
     catch(Exception ex)
     {
         //Bloody exception is never caught.
     }
}

我知道TextChanged() 的条件距离执行性能还有光年,但在这一点上,我只想让它工作。

当用户输入相当长的句子或退格几次时,会引发上述异常。

整个例外是Java.Lang.ArrayIndexOutOfBoundsException: length=20; index=20

备注

1) 我尝试运行Environment.StackTrace,但它冻结了,我只是不知道它被扔到了哪里。对此的任何帮助将不胜感激。

2) 当总长度大于 20 个字符并且 awaited 方法直接接收到 Text 属性时,它曾经抛出这个异常,我怀疑它与正在运行的线程中的值一起损坏。传递一个变量 (text) 解决了 that 问题。

3) 我知道Java.Lang.ArrayIndexOutOfBoundsException 是什么意思。我只是不知道何时它正在访问超出范围的索引。

4) Xamarin Forms 的Editor 有同样的问题。

5) 一些上下文来澄清这个文本框应该做什么:它应该作为一个自动完成(能够)条目,用户输入几个字母,列表视图填充结果,并不断更新为剩下的字母被输入。

【问题讨论】:

  • 尝试捕获(异常){ }
  • 有趣的是,如果没有提供变量,它会捕获异常,但遗憾的是我不能忽略这个问题。
  • 检查 doSomeMadlyDemandingRandomStuff 的实现。
  • 它使用提供的字符串通过DependencyService 将其发送到基于Android 的组件。应该不是问题。
  • 没关系。捕获没有变量的异常根本没有捕获它。

标签: c# android xamarin.forms


【解决方案1】:

我发现doSomeMadlyDemandingRandomStuff 的潜在问题...事件?作为测试,您可能希望暂时禁用文本框,直到“MadlyDemandingRandomStuff”完成,以查看在第一个处理程序完成之前再次调用此处理程序是否是问题的直接原因,例如:

public async void TextChanged()
{
    textbox.IsEnabled = false;
    try
    {
        if(textbox.Text.Length > 5) //< This sucks and I know it. 
        {
            string text = textbox.Text;
            await Task.Run(()=>doSomeMadlyDemandingRandomStuff(text));
            textbox.IsEnabled = true;
        }
    }
    catch(Exception ex)
    {
     //Bloody exception is never caught.
    }
}

我知道这可能不是“答案”,但它可能有助于找到问题,因此将其发布。

此外,如果这是本机异常,有时本机异常会导致应用在任何异常被发送回托管端之前崩溃,因此您的 catch 块永远不会捕获它。

【讨论】:

  • 感谢您的回答,@jgoldberger。我更新了这个问题,为文本框应该做什么提供了一些背景信息。 鼓励用户继续输入,如果我禁用该组件,Android 的键盘将被“推回”。
  • @EricWu 我创建了自己的自动完成页面,在用户键入时填充了ListView(它为数据调用服务),我添加了一个节流阀TimeSpan,它可能类似于禁用没有让用户看到效果的文本框。在您的Task.Run 中添加类似以下内容:if(DateTime.UtcNow - _lastRequestDateTime &lt;= TimeSpan.FromMilliseconds(500)) { return; } _lastRequestDateTime = DateTime.UtcNow;
  • @hvaughan3 这实际上听起来有道理,但似乎有点......丑陋。我会尝试一下,如果有效,我会告诉你。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-04
  • 2021-03-28
  • 1970-01-01
  • 2022-07-29
  • 2021-07-24
  • 2016-04-27
  • 2021-11-26
相关资源
最近更新 更多