我创建了一个简单的应用程序,它遍历一个大的(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进程立即完成,然后资源占用过程从其他地方启动(由变量值的变化触发)。
下面是我正在使用的代码。稍后,我将尝试制作第二个应用程序,将资源占用过程放在后面,如SimonAndré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;
}
});
答案 0 :(得分: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);