2

同時に多くの操作を選択できる教育用数学ゲームを作成しています。現在、5 つの質問を生成しようとしていますが、5 つの質問すべてが非常に高速に実行されるため、最後の質問を除いて答えることはできません。最初の質問を作成した後にwait()を作成し、それが解決されて正しく回答されるまで待機し、次の質問に進むなどのスレッドを作成することを考えました...今まで待機と通知を使用したことがないので、どこでこれまでに得たものをここに割り当てる必要がありますが、例外があります。

 while (counter < 5) {
    Thread pause = new Thread() {

        @Override
        public void run() {
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally{

                // ops array is for knowing what operation he chose, 
                // 1 for plus and 2 for minus
                //generate random number within the range of the operations length.
                int gen = Integer.valueOf((int) ((Math.random() * (ops.length))));
                Log.d("Testgen", String.valueOf(gen));

                //random operation is generated
                int TheChosenOperation = ops[gen]; 
                Log.d("Test The chosen", String.valueOf(TheChosenOperation));

                switch (TheChosenOperation) {
                case 1: // if it is plus, assign the generated numbers to i and j from plus.java
                    Toast t = Toast.makeText(SecondActivity.this, "Plus", 5000);
                    t.show();
                    tv.setText("+");
                    int i = plus.getBorder();
                    int j = plus.getBorder2();
                    tv2.setText(String.valueOf(i));
                    tv3.setText(String.valueOf(j));
                    answer = plus.getAnswer();
                    break;
                case 2: //if it is minus, assign the generated numbers to i and j from minus.java
                    Toast t2 = Toast.makeText(SecondActivity.this, "minus", 5000);
                    t2.show();
                    tv.setText("-");
                    int i2 = minus.getBorder();
                    int j2 = minus.getBorder2();
                    tv2.setText(String.valueOf(i2));
                    tv3.setText(String.valueOf(j2));
                    answer = minus.getAnswer();
                    break;
                }
                b.setOnClickListener(new OnClickListener() {

                    public void onClick(View arg0) {
                        // TODO Auto-generated method stub
                        if (answer > 0 && answer == Integer.parseInt(ed.getText().toString())) {
                            Toast t = Toast.makeText(SecondActivity.this, "true",
                                    5000);
                            t.show();
                            this.notify(); // if the answer is true then notify()
                        } else {
                            Toast t = Toast.makeText(SecondActivity.this, "false",
                                    5000);
                            t.show();
                        }

                    }
                }); // end of clicklistner
                counter++; // counting for 5 questions


            }//finally
        }//run

    }; // end of thread
    pause.start();
 } //end of while loop

私はまだAndroidとスレッドに慣れていないので、しばらくお待ちください。事前に感謝し、私のひどい英語で申し訳ありません.

4

1 に答える 1

1

このコンテキストでの の使用はThread、実際には正しくありません。

  • UI 状態の表示と管理を担当するメイン スレッドまたは UI スレッドがあります。TextView、 などのUI 要素に変更を加える場合Buttonは、このスレッドで行う必要があります。このスレッドで長時間のタスクを保持したり、このスレッドを待機させたりすると、アプリケーションが応答しなくなり、Android OS に ANR ダイアログが表示されます。(詳細については、アプリの応答性を維持する を参照してください)
  • Threads は通常、実行する並行タスクがある場合に使用されます。この場合、タスクは実際には同時実行ではなく、順次実行されます。

アプリケーションがイベントに基づいて決定を下すイベント ドリブン アプローチの観点からさらに考える必要があります (質問への回答のように、回答された質問の数を確認して、さらに質問を生成する必要があるかどうかを判断するために使用できます)。

于 2013-05-21T13:43:30.657 に答える