2

tryブロックが最初に実行されるのはなぜですか。最初に色を変更してから、5000msスリープする必要があります。つまり、色が変わる前にシステムがスリープするということです。private OnClickListener CheckAnswer = new OnClickListener(){

    public void onClick(View arg0) {
        // TODO Auto-generated method stub

        disableButtons();
        Button incoming=(Button) arg0;
        if(incoming.getText().toString().equals(Q.getAnswer()))
        {
            incoming.setBackgroundColor(Color.GREEN);
            correct++;
            score+=15;
        }
        else 
        {
            incoming.setBackgroundColor(Color.RED);
            wrong++;
            if(C1.getText().toString().equals(Q.getAnswer()))
                C1.setBackgroundColor(Color.GREEN);
            else if(C2.getText().toString().equals(Q.getAnswer()))
                C2.setBackgroundColor(Color.GREEN);
            else if(C3.getText().toString().equals(Q.getAnswer()))
                C3.setBackgroundColor(Color.GREEN);
            modifyScore();

        }
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        questionGenerator();
    }
};`
4

3 に答える 3

9

ビューのプロパティが更新されたためだと思いますが、画面の再描画が眠りについたままになっています。メインスレッドでスリープしないでください。

代わりに、アクティビティのonCreateでハンドラーを作成し、遅延したRunnableをそれに投稿します。

private Handler mHandler;
protected void onCreate(Bundle savedInstanceState) {
    mHandler = new Handler();
}
...
private OnClickListener CheckAnswer = new OnClickListener() {
     public void onClick(View view) {
       // fix up view
       mHandler.postDelayed(new Runnable() {
           @Override
           public void run() {
               questionGenerator();
           }
       }, 10000);
   }
}
于 2012-08-07T21:07:17.130 に答える
2

GUIのメインスレッド(SwingではEDTと呼ばれるもの)で作業しています。これは、更新も行うのと同じスレッドです。したがって、シーケンスは次のとおりです。

  1. 新しい背景色を設定します
  2. 10秒寝る
  3. onClick戻り値
  4. メインスレッドはコンポーネントを更新する機会があります

背景色が変わらないだけでなく、完了するまでUI全体がフリーズしているように見えることがわかると思いますThread.sleep

スレッドがコンポーネントの更新を含むタスクを自由に実行できるように、別のスレッドでメインの作業を行う必要があります(Androidはわかりませんが、SwingではSwingWorkerを使用できます)。

于 2012-08-07T21:04:06.247 に答える
0

まず、UIスレッドでスリープしないでください。強制終了が発生します。次に、OnClickListenerが終了するまで、コントロールの実際の(再)ペイントは実行できません。

于 2012-08-07T21:06:13.117 に答える