0

Я сделал простую программу, которая проходит через все строки большого текстового файла (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; 
    } 
}); 
+1

Просто примечание стороны, в соответствии с соглашениями об именах java, имена переменных (такие как 'MyEditText' и' MyButton') должны начинаться с низкого ercase письмо. Прямо сейчас, для большинства разработчиков Java при первом образе вашего кода MyEditText и MyButton звучат как имя класса, учитывая стартовую букву верхнего регистра. –

+0

Я считаю, что вызов setOnKeyListener не является тем, что заставляет ваше приложение перестать отвечать на запросы, а скорее то, что вы на самом деле делаете нажатием кнопки «MyButton». Однако, если вы считаете, что код в вашем вопросе является тем, что вызывает проблему, я думаю, вы должны проверить, как часто это называется (добавьте «Log.i» («Вызов выполнить щелчок»); 'перед строкой« MyButton.performClick »();) –

+0

@Simon André Forsberg Я отредактирую это очень быстро, чтобы предотвратить путаницу. –

ответ

1

Вы должны выполнять такие длительные операции в AsyncTask

Вот пример того, как я сделал бы это:

class ScanTextTask extends AsyncTask<String, Void, List<String>> { 
    protected List<String> doInBackground(String... param) { 
     // load file from the string param[0] 
     // add all the results to a list and return the list 
    } 

    protected void onPostExecute(List<String> result) { 
     // add the result to the UI of your choice 
    } 
} 

И затем, чтобы запустить задачу использовать: new ScanTextTask().execute(filename);

+0

Спасибо за предложение. В следующий раз я обязательно попробую. На данный момент мне просто нужно выяснить, как заставить этот код OnKeyListener, сидящий в моем приложении, вызывать приглашения ANR. –

+0

@EricGlass, что произойдет, если вы нажмете кнопку напрямую, не используя метод клавиш вниз? Разве АНК не происходит тогда? Я считаю, что переход на AsyncTask будет решать приглашение ANR, поскольку он будет выполнять операцию в фоновом режиме без блокировки UI-потока. –

+0

Нажатие кнопки (вручную или нажатием клавиши Enter) не вызывает приглашение ANR.Запрос появляется только после того, как приложение просматривает текстовый файл примерно на 4 секунды. Если я удалю этот код OnKeyListener, я не получаю приглашений ANR, даже если приложение сидит там 20 секунд. Я определенно буду пытаться использовать опцию AsyncTask в ближайшем будущем, но я все еще должен знать, как добавить этот бит, казалось бы, безвредного кода, заставить вызвать приглашения ANR, когда они вообще не появлялись раньше. –

Смежные вопросы