我正在创建一个应用程序,当按下一个按钮时,它会在“ 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中的按钮


您的代码需要进行一些重构,但最终会起作用。

10-07 19:19
查看更多