大きな (1.5MB) テキスト ファイルのすべての行を調べ、特定の単語を含む各行を表示する単純なアプリを作成しました (この単語は、EditText を介してユーザーから受け取ります)。このアプリは、テキスト ファイルを検索している間、間違いなく私のデバイスに多大な負担をかけますが、以下のコードを追加するまで、ANR プロンプトを 1 つも受け取ったことはありませんでした。現在、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 プロンプトは、Enter キーを押してトリガーされてから数秒以内に OnKeyListener プロセスを完了できなかったことが原因のようです。時間のかかるリソースを大量に消費するプロセスが開始され、完了が遅れたため、完了できませんでした。解決策は、リソースを大量に消費するプロセスを起動する代わりに、OnKeyListener プロセスに変数の値を変更させるだけでした。これにより、OnKeyListener プロセスがすぐに完了し、リソースを大量に消費するプロセスが別の場所から起動されます (変数の値の変更によってトリガーされます)。
以下は、私が現在使用しているコードです。後日、以下の Simon André Forsberg の推奨に従って、リソースを大量に消費するプロセスをバックグラウンドに置く 2 つ目のアプリを作成してみます。
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;
}
});