Android setOnKeyListener导致ANR (Application Not Responding)提示



我制作了一个简单的应用程序,它可以遍历一个大(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进程立即完成,然后从其他地方启动资源占用进程(通过更改变量的值触发)。

下面是我现在使用的代码。在晚些时候,我将尝试制作第二个应用程序,将资源占用进程放在后台,正如西蒙·安德烈·弗斯伯格所建议的那样。

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

你应该在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);

相关内容

  • 没有找到相关文章

最新更新