0

大きな (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;
   }
});
4

1 に答える 1

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

于 2013-06-06T20:46:32.803 に答える