Я сделал простую программу, которая проходит через все строки большого текстового файла (1,5 МБ) и отображает каждую строку, содержащую определенное слово (слово получено от пользователя через EditText). Приложение определенно ставит мое устройство под большой нагрузкой, пока оно просматривает текстовый файл, но я никогда не получал ни одного приглашения ANR до Я добавил код ниже. Теперь я часто получаю приглашения ANR. Удаление кода из приложения избавляется от запросов ANR. Что это за код, который может вызывать запросы? Это написано неправильно? Помимо появления приглашений ANR, он работает правильно.Android setOnKeyListener вызывает запрос ANR (приложение не отвечает)
editText1.setOnKeyListener(new EditText.OnKeyListener()
{
public boolean onKey(View v, int keyCode, KeyEvent event)
{
if ((event.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER))
{
button1.performClick();
return true;
}
return false;
}
});
EDIT:
Он появляется подсказка ANR была результатом процесса OnKeyListener не в состоянии завершить в течение нескольких секунд, которые инициированы с помощью Enter нажатия клавиши. Он не смог завершить, потому что он запустил многозадачный процесс обработки ресурсов, который задерживал его завершение. Решение заключалось только в том, чтобы процесс OnKeyListener изменил значение переменной вместо запуска процесса обработки ресурсов. Это позволяет сразу завершить процесс OnKeyListener, затем процесс загрузки ресурсов запускается из другого источника (вызванный изменением значения переменной).
Ниже приведен код, который я использую сейчас. Позднее, я попробую сделать второе приложение, которое ставит процесс обработки ресурсов в фоновом режиме, как рекомендовал Саймон Андре Форсберг ниже.
final Handler mHandler = new Handler();
new Thread(new Runnable()
{
@Override
public void run()
{
while (true)
{
try
{
mHandler.post(new Runnable() {
@Override
public void run()
{
if (NeedToClickButton == 1)
{
NeedToClickButton = 0
button1.performClick();
}
}
});
} catch (Exception e) {
}}}}).start();
editText1.setOnKeyListener(new EditText.OnKeyListener()
{
public boolean onKey(View v, int keyCode, KeyEvent event)
{
if ((event.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER))
{
NeedToClickButton = 1;
return true;
}
return false;
}
});
Просто примечание стороны, в соответствии с соглашениями об именах java, имена переменных (такие как 'MyEditText' и' MyButton') должны начинаться с низкого ercase письмо. Прямо сейчас, для большинства разработчиков Java при первом образе вашего кода MyEditText и MyButton звучат как имя класса, учитывая стартовую букву верхнего регистра. –
Я считаю, что вызов setOnKeyListener не является тем, что заставляет ваше приложение перестать отвечать на запросы, а скорее то, что вы на самом деле делаете нажатием кнопки «MyButton». Однако, если вы считаете, что код в вашем вопросе является тем, что вызывает проблему, я думаю, вы должны проверить, как часто это называется (добавьте «Log.i» («Вызов выполнить щелчок»); 'перед строкой« MyButton.performClick »();) –
@Simon André Forsberg Я отредактирую это очень быстро, чтобы предотвратить путаницу. –