0

メソッド内に2秒間待機するたびにループがあり、ループが再度実行されるrandomText()メソッドを実行しようとしています。毎回乱数を 1 または 0 にする必要があります。その 0 の場合は LEFT を示し、1 の場合は RIGHT を示します。しかし、実際には常に LEFT を示し、変化しません! スレッドの問題なのか、元のコードなのかわかりません。

public class MainActivity extends Activity {
Scanner in = new Scanner(System.in);

Button left , right ;
TextView text ;
int value , mistake , pressed ;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    //value = 0; // 0:left 1:right 2:didnt pressed any
    mistake = 0; // max mistake = 3

    left = (Button) findViewById(R.id.button1); // value of the key is 0
    right = (Button) findViewById(R.id.button2); // value of the key is 1
    text = (TextView) findViewById(R.id.textView1);
    randomText();
    //*** set actions

    left.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            pressed = 1;
            if(value != 0)      { mistake++; }
        }
    });
    right.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            pressed = 1;
            if(value != 1)      { mistake++; }
        }
    });

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

public void randomText(){
    Random r = new Random();
    for (int i=0;i<10 && mistake <=2 ;i++){
        value = r.nextInt(2);
        pressed = 0; // 
        if (value == 1)
            text.setText("RIGHT");
        else
            text.setText("LEFT");
        try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                // We've been interrupted

            }

         if (pressed == 0)  mistake++;
    }
}
}
4

1 に答える 1

0

1 つは、メイン スレッドで randomText() を呼び出している場合です。これは、pressed をループ内で 0 に設定したため、別のスレッドで変更しない限り 0 のままであることを意味します。ボタンのクリックはメイン スレッドでも発生するため、randomText() の実行中に押された状態を別のものに変更することはできません。

これは、text.setText() の呼び出しを停止する前に、randomText() メソッドで正確に 3 回反復することを意味します。

さらに、Random r の Random(long seed) コンストラクターを呼び出す必要があります。通常、シードには現在の時刻を使用することをお勧めします。そのため、Random オブジェクトは次のように初期化する必要があります。

Random r = new Random(System.currentTimeMillis());
于 2013-08-29T08:05:38.773 に答える