2011-07-29 20 views
0

私のアンドロイドアプリでは、2つのボタンがあり、最初のボタンがwhileループを開始し、2番目のボタンが停止し、do_something()メソッドを実行する必要があるとします。再び連続的に。whileループの実装はandroid

public void onCreate() { 
     my_var = true; 
     ok = (Button)findViewById(R.id.button1); 
     ok.setOnTouchListener(new OnTouchListener() { 

      @Override 
      public boolean onTouch(View v, MotionEvent event) { 


       if (event.getAction() == MotionEvent.ACTION_DOWN) { 
        while(my_var) do_something(); 
       } 

       return true; 
      } 
     }); 

     stop = (Button)findViewById(R.id.button2); 
     stop.setOnTouchListener(new OnTouchListener() { 

      @Override 
      public boolean onTouch(View v, MotionEvent event) { 


       if (event.getAction() == MotionEvent.ACTION_DOWN) { 
        my_var = false; 
       } 

       return true; 
      } 
     }); 

次に、私のアプリケーションと私の電話全体がちょうど凍ってしまいます。一目で誰でも私が間違ってやっていることを伝えることはできますか? aLogCatは私に多くの情報を与えていません。 ご迷惑をおかけして申し訳ございません。

+0

アプリを起動するとき、またはボタンを押したときにフリーズするのはなぜですか? – tutts

答えて

3

ループがUIスレッドで実行され、UIがイベントを処理して停止できないため、フリーズします。したがって、停止することはできません。あなたはそのような機会に別のスレッドを使用する必要があります。

3

アンドロイドは現在のメソッドが返るまで、アンドロイドがUIスレッドに新しい呼び出しを行ってより多くのメッセージを送信することができないため、UIスレッドでは処理を続行できません。

この場合、whileループの終了は、新しいUIイベントへの応答であり、whileループを終了して返されるまでは配信できません。

2

UIスレッドは処理イベントが発生しないため、ループできません。あなたがすることができることは、あなたが望むことをするために別のインテントサービスを作ることです。

また、代わりにonTouchリスナーを使用して、あなたはあなたのコードをクリーンアップする可能性があり、ボタンにこの属性を使用します。あなたの活動の後、

android:onClick="onOkTouch" 

と、この持っている:

public void onOkTouch(View v, MotionEvent event){ 
    ... 
} 
2

へのあなたはこのようなスレッドで実装することができますフリーズUIスレッドを避ける[参考文献1]:

public class MyThread extends Thread { 
    private volatile boolean m_bIsRunning= true; 

    public void stop() { 
     bIsRunning= false; 
    } 

    public void run() { 
     while (bIsRunning) { 
     do_something() 
     }  
    } 
} 

R eferences:this

関連する問題