I'm creating an application that generates some chirp sounds into a "for loop" when a button is pressed, and I want to block the button during the loop, and realease them when the loop is over.
I tried this, but the application crash:
package android.nacho.UltraSoundSender;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
public class UltraSoundSender extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_ultra_sound_sender);
        Button btnCode = (Button) findViewById(R.id.btnCode);
        btnCode.setOnClickListener(new OnClickListener() {
            //@Override
            public void onClick(View arg0) {            
                enableButton(false);
                new Thread( new Runnable( ) 
                {
                   public void run( )
                   {   
                       //working=false;
                      // int Code=Integer.parseInt(((EditText)findViewById(R.id.Code)).getText().toString());
                       //((EditText)findViewById(R.id.Code)).setText("");
                       String word= ((EditText)findViewById(R.id.Code)).getText().toString();
                       Integer digits[]= new Integer[64];
                       int NumChar= word.length();
                       //This split the string in chars
                       for(int i = 0; i <  NumChar ; i++){
                           digits[i]=(int)word.charAt(i);
                            }
                      //Values of the chirp
                       int startFreq = 3000;
                       int endFreq = 7000;
                       double impulseDuration = 50;
                       for(int IndexChar= 0; IndexChar< NumChar ; IndexChar++)
                       {
                            new ChirpGenerator().playDOWN(startFreq, endFreq, impulseDuration, digits[IndexChar]);
                            try {
                                Thread.sleep(500);
                            } catch (InterruptedException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                       }
                       enableButton(true);
                   }
                } ).start();
            }
        });
}
    //Enable/disable button
    private void enableButton(boolean isEnable)
    {
        ((Button)findViewById(R.id.btnCode)).setEnabled(isEnable);
}
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_ultra_sound_sender, menu);
        return true;
    }
}
I get this errores in the logcat:
06-19 11:15:00.852: E/AndroidRuntime(29419): FATAL EXCEPTION: Thread-5516 06-19 11:15:00.852: E/AndroidRuntime(29419): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 06-19 11:15:00.852: E/AndroidRuntime(29419): at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:4746) 06-19 11:15:00.852: E/AndroidRuntime(29419): at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:854) 06-19 11:15:00.852: E/AndroidRuntime(29419): at android.view.ViewGroup.invalidateChild(ViewGroup.java:4077) 06-19 11:15:00.852: E/AndroidRuntime(29419): at android.view.View.invalidate(View.java:10322) 06-19 11:15:00.852: E/AndroidRuntime(29419): at android.widget.TextView.invalidateDrawable(TextView.java:4601) 06-19 11:15:00.852: E/AndroidRuntime(29419): at android.graphics.drawable.DrawableContainer.invalidateDrawable(DrawableContainer.java:250) 06-19 11:15:00.852: E/AndroidRuntime(29419): at android.graphics.drawable.Drawable.invalidateSelf(Drawable.java:338) 06-19 11:15:00.852: E/AndroidRuntime(29419): at android.graphics.drawable.Drawable.setVisible(Drawable.java:549) 06-19 11:15:00.852: E/AndroidRuntime(29419): at android.graphics.drawable.DrawableContainer.selectDrawable(DrawableContainer.java:307) 06-19 11:15:00.852: E/AndroidRuntime(29419): at android.graphics.drawable.StateListDrawable.onStateChange(StateListDrawable.java:106) 06-19 11:15:00.852: E/AndroidRuntime(29419): at android.graphics.drawable.Drawable.setState(Drawable.java:465) 06-19 11:15:00.852: E/AndroidRuntime(29419): at android.view.View.drawableStateChanged(View.java:14281) 06-19 11:15:00.852: E/AndroidRuntime(29419): at android.widget.TextView.drawableStateChanged(TextView.java:3184)
Where should I call the enabale function? I guess out of the Thread but how?
 
     
     
     
    