Я создаю приложение, которое генерирует некоторые звуки чириканья в «цикл цикла», когда нажимается кнопка, и я хочу заблокировать кнопку во время цикла и повторить их, когда цикл кончено.Android: отключить кнопку через некоторое время
Я попытался это, но сбой приложения:
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;
}
}
Я получаю эту errores в 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: только исходный поток , создавший иерархию представлений, может коснуться его представлений. 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.drawabl e.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)
Где я могу назвать функцию enabale? Думаю, из темы, но как?
попробуйте использовать 'AsyncTask' вместо того, что вы делаете сейчас. – 7bluephoenix