web-dev-qa-db-ja.com

androidにwhileループを実装する

Androidでのwhileループの実装を理解できません。

onCreate()バンドル内にwhileループを実装するときはいつでも(以下に示すコード)

_public void onCreate(Bundle icicle) {       
  super.onCreate(icicle);
  setContentView(R.layout.main);
  TextView=(TextView)findViewById(R.id.TextView);
  while (testByte == 0)
      updateAuto(); 
}
_

何も起動せず、しばらくするとプログラムが「ハング」状態になり、理由がわかりません。 Testbyteは次のとおりです。

_byte testByte == 0;
_

updateAuto()は、1秒ごとにコードを更新し、textView部分内に表示することになっています。以下に示すようにupdateAuto()内でsetTextを使用していて、すべてが正常に機能しますが、whileループを実装すると、表示されるのは黒い画面であり、「応答しない」ために数秒後に強制的に閉じるオプションがあります。

_TextView.setText(updateWords);
_

私はそれをボタン形式に変更しました(つまり、今のところボタン自体をクリックして更新する必要があります)が、手動でクリックするのではなく、更新する必要があります。

Whileループを間違った方法で実装していますか?

また、別の関数でwhileループを呼び出してみましたが、それでも何もない黒い画面が表示されます。

私はハンドラーサービスについて何かを読んでいます...それは何をしますか?ハンドラーサービスは、TextViewをより安全またはメモリ効率の高い方法で更新できますか?

誰かが私がこれで何をすべきかについていくつかの指針を与えてくれれば感謝します。

12
Kyle Yeo

あなた自身を支えます。そして、密接にフォローしてみてください、これは開発者にとって非常に貴重です。

Whileループは実際には別のスレッドでのみ実装する必要があります。別のスレッドは、アプリで実行されている2番目のプロセスのようなものです。強制的に閉じるのは、UIスレッドでループを実行したため、UIがそのループを通過する以外は何もできないためです。そのループを2番目のスレッドに配置して、UIスレッドを自由に実行できるようにする必要があります。スレッド化するときは、UIスレッドを使用していない限り、GUIを更新できません。この場合の方法は次のとおりです。

まず、Runnableを作成します。これには、runメソッドでループするコードが含まれます。そのRunnableでは、UIスレッドにポストする2番目のRunnableを作成する必要があります。例えば:

 TextView myTextView = (TextView) findViewById(R.id.myTextView); //grab your tv
 Runnable myRunnable = new Runnable() {
      @Override
      public void run() {
           while (testByte == 0) {
                Thread.sleep(1000); // Waits for 1 second (1000 milliseconds)
                String updateWords = updateAuto(); // make updateAuto() return a string
                myTextView.post(new Runnable() { 
                     @Override
                     public void run() {
                          myTextView.setText(updateWords);
                     });
           }
      }
 };

次に、Runnableを使用してスレッドを作成し、開始します。

 Thread myThread = new Thread(myRunnable);
 myThread.start();

これで、強制終了せずにアプリがループしているはずです。

33
Zaid Daghestani