2016-10-13 2 views
0

Я использую Xamarin Forms 'Entry для извлечения некоторых данных, когда вызывается событие OnTextChanged.Xamarin Forms Entry throwing Java.Lang.ArrayIndexOutOfBoundsException

Иногда он выдает неуправляемый 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() является световых лет от того performatic, но на данный момент, я просто хочу, чтобы работать.

Вышеупомянутое исключение выдается, когда пользователь вводит довольно длинное предложение или когда он занимает несколько раз.

Полное исключение составляет Java.Lang.ArrayIndexOutOfBoundsException: length=20; index=20.

Замечания

1) Я пытался запустить Environment.StackTrace, но она замерзает, и я просто не знаю, где она брошена. Любые помощь в этом отношении будет оценена по достоинству.

2) Он использовал это исключительное исключение, когда общая длина была больше 20 символов, а метод await ed получил свойство Text, которое, я подозреваю, искалечило значения из текущей темы. Передача переменной (text) решена что проблема.

3) Я знаю, что означает Java.Lang.ArrayIndexOutOfBoundsException. Я просто не знаю , когда обращается к индексу, который выходит за пределы.

4) Xamarin Forms 'Editor имеет ту же проблему.

5) Некоторый контекст для разъяснения того, что должно делать это текстовое поле: он должен использоваться как запись автозаполнения (возможности), где пользователь вводит несколько букв, список просматривается с результатами и постоянно обновляется как набираются остальные буквы.

+1

try catch (Exception) { } –

+0

Забавно, что он ловит исключение, если переменная не предоставляется, но, к сожалению, я не могу просто игнорировать эту проблему. –

+0

проверка doSomeMadlyDemandingRandomStuff осуществление. –

ответ

0

Я вижу потенциальные проблемы с 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 никогда не поймает его.

+0

Спасибо за ваш ответ @jgoldberger. Я обновил вопрос, чтобы предоставить некоторый контекст тому, что должно делать текстовое поле. Пользователь _encouraged_, чтобы продолжать печатать и, если я отключу компонент, клавиатура Android «отброшена». –

+0

@ EricWu Я создал свою собственную страницу автозаполнения, которая заполняет «ListView», как мы er (он вызывает службу для данных), и я добавил дроссель 'TimeSpan', который может работать аналогично отключению текстового поля без возможности видеть пользователя. Добавляем что-то вроде следующего в 'Task.Run':' if (DateTime.UtcNow - _lastRequestDateTime <= TimeSpan.FromMilliseconds (500)) {return; } _lastRequestDateTime = DateTime.UtcNow; ' – hvaughan3

+0

@ hvaughan3, что на самом деле звучит правдоподобно, но кажется немного ... уродливым. Я собираюсь попробовать, и если это сработает, я дам вам знать. –