我正在创建一个应用程序,当按下一个按钮时,它会在“ for循环”中生成一些rp声,并且我想在循环过程中阻塞该按钮,并在循环结束时重新实现它们。
我试过了,但是应用程序崩溃了:
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;
}
}
我在logcat中收到此错误:
06-19 11:15:00.852:E / AndroidRuntime(29419):致命异常:
线程5516 06-19 11:15:00.852:E / AndroidRuntime(29419):
android.view.ViewRootImpl $ CalledFromWrongThreadException:仅
创建视图层次结构的原始线程可以触摸其视图。
06-19 11:15:00.852:E / AndroidRuntime(29419):在
android.view.ViewRootImpl.checkThread(ViewRootImpl.java:4746)06-19
11:15:00.852:E / AndroidRuntime(29419):位于
android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:854)
06-19 11:15:00.852:E / AndroidRuntime(29419):在
android.view.ViewGroup.invalidateChild(ViewGroup.java:4077)06-19
11:15:00.852:E / AndroidRuntime(29419):位于
android.view.View.invalidate(View.java:10322)06-19 11:15:00.852:
E / AndroidRuntime(29419):在
android.widget.TextView.invalidateDrawable(TextView.java:4601)06-19
11:15:00.852:E / AndroidRuntime(29419):位于
android.graphics.drawable.DrawableContainer.invalidateDrawable(DrawableContainer.java:250)
06-19 11:15:00.852:E / AndroidRuntime(29419):在
android.graphics.drawable.Drawable.invalidateSelf(Drawable.java:338)
06-19 11:15:00.852:E / AndroidRuntime(29419):在
android.graphics.drawable.Drawable.setVisible(Drawable.java:549)06-19
11:15:00.852:E / AndroidRuntime(29419):位于
android.graphics.drawable.DrawableContainer.selectDrawable(DrawableContainer.java:307)
06-19 11:15:00.852:E / AndroidRuntime(29419):在
android.graphics.drawable.StateListDrawable.onStateChange(StateListDrawable.java:106)
06-19 11:15:00.852:E / AndroidRuntime(29419):在
android.graphics.drawable.Drawable.setState(Drawable.java:465)06-19
11:15:00.852:E / AndroidRuntime(29419):位于
android.view.View.drawableStateChanged(View.java:14281)06-19
11:15:00.852:E / AndroidRuntime(29419):位于
android.widget.TextView.drawableStateChanged(TextView.java:3184)
我应该在哪里调用enabale函数?我猜不出主题,但是怎么办?
最佳答案
当您在线程末尾enableButton(false)
时,您如何期望按钮被启用?请尝试使用enableButton(true)
,我敢肯定这只是一个错字。 :)
另外,在您的情况下,只有UI线程可以触摸视图,请查看AsyncTask。基本上:
禁用onPreExecute
中的按钮
在doInBackground
中进行后台工作
启用onPostExecute
中的按钮
您的代码需要进行一些重构,但最终会起作用。