Java Android setOnKeyListener导致ANR(应用程序无响应)提示

Java Android setOnKeyListener导致ANR(应用程序无响应)提示,java,android,android-edittext,onkeydown,android-anr-dialog,Java,Android,Android Edittext,Onkeydown,Android Anr Dialog,我制作了一个简单的应用程序,它遍历一个大(1.5MB)文本文件的所有行,并显示包含特定单词的每一行(该单词通过EditText从用户处接收)。 该应用程序在搜索文本文件时确实让我的设备承受了很大的压力,但在我添加下面的代码之前,我从未收到过任何ANR提示。现在我经常收到ANR提示。从应用程序中删除代码可以消除ANR提示。这段代码是什么导致了提示?写得不对吗?除了引起ANR提示外,它工作正常 editText1.setOnKeyListener(new EditText.OnKeyListener

我制作了一个简单的应用程序,它遍历一个大(1.5MB)文本文件的所有行,并显示包含特定单词的每一行(该单词通过EditText从用户处接收)。 该应用程序在搜索文本文件时确实让我的设备承受了很大的压力,但在我添加下面的代码之前,我从未收到过任何ANR提示。现在我经常收到ANR提示。从应用程序中删除代码可以消除ANR提示。这段代码是什么导致了提示?写得不对吗?除了引起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;
   }
});
编辑:

ANR提示似乎是OnKeyListener进程无法在通过按Enter键触发的几秒钟内完成的结果。它无法完成,因为它启动了一个耗时的资源占用过程,延迟了它的完成。 解决方案是让OnKeyListener进程更改变量的值,而不是启动占用资源的进程。这允许OnKeyListener进程立即完成,然后从其他地方启动占用资源的进程(由变量值的更改触发)

下面是我现在使用的代码。稍后,我将尝试制作第二个应用程序,按照西蒙·安德烈·福斯伯格(Simon AndréForsberg)的建议,将占用资源的过程置于后台

   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;
   }
});

你应该在一个安全的环境中执行如此长的操作

下面是一个我将如何做到这一点的示例:

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
     }
 }
类ScanTextTask扩展了AsyncTask{
受保护列表doInBackground(字符串…参数){
//从字符串参数[0]加载文件
//将所有结果添加到列表并返回列表
}
受保护的void onPostExecute(列表结果){
//将结果添加到您选择的UI中
}
}
然后,要开始您使用的任务:
new ScanTextTask().execute(文件名)

只是一个旁注,根据java命名约定,变量名(如
MyEditText
MyButton
)应该以小写字母开头。现在,对于大多数java开发人员来说,在代码的第一眼看到MyEditText和MyButton时,考虑到大写的起始字母,它听起来像是一个类名。我相信调用setOnKeyListener并不是导致应用程序停止响应的原因,而是您在单击“MyButton”时实际执行的操作。但是,如果您认为问题中的代码是导致问题的原因,我认为您应该检查调用它的频率(在“MyButton.performClick();”行之前添加
Log.I(“调用执行单击”);
)@西蒙·安德烈·福斯伯格:我会很快编辑它以避免混淆。@西蒙·安德烈·福斯伯格:除非我按下回车键,否则它不应该点击按钮(当然,除非它写得不正确)。。。我将尝试找出如何做日志。我知道您推荐的方法。使用日志。我只是向日志提供信息/调试的一种方法。要查看日志,您必须查看logcat,它可以直接在Eclipse中查看,也可以使用adb命令使用。谢谢你的建议。下次我一定要试试。现在我只需要弄清楚,在我的应用程序中使用这个OnKeyListener代码是如何导致ANR提示的。@EricGlass如果直接单击按钮而不使用向下键方法会发生什么?那么ANR不是也会发生吗?我相信切换到AsyncTask将解决ANR提示,因为它将在后台执行操作,而不会阻塞UI线程。单击按钮(手动或通过按Enter键)不会导致ANR提示。应用程序在文本文件中搜索了大约4秒钟后,提示才会出现。如果我删除这个OnKeyListener代码,我不会得到ANR提示,即使应用程序在那里搜索了20秒。在不久的将来,我肯定会尝试AsyncTask选项,但我仍然要知道,添加这段看似无害的代码是如何使ANR提示在以前根本没有出现的情况下出现的。@EricGlass一个20秒没有响应的应用程序仍然是个问题,即使你没有收到ANR提示。我相信原因可能是,当您使用密钥侦听器时,您的代码希望执行两次,但第二次无法执行,因为第一次未完成,因此会出现ANR提示,因为您的应用程序太忙,无法响应希望执行的代码。您应该尽快使用AsyncTasks。现在它会解决你所有的问题。擦掉它。我误读了你说的话。按Enter键而不是手动按屏幕上的按钮似乎是问题的根源。很高兴你问了这个问题。现在我们有进展了。