我制作了一个简单的应用程序,它遍历一个大 (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;
}
});