4

アプリケーションの背景を 3 秒ごとに変更する小さなアプリを作成しました。これを実現するために、Handler と Runnable オブジェクトを使用しました。それはうまくいっています。これが私のコードです:

  public class MainActivity extends Activity {

        private RelativeLayout backgroundLayout;
        private int count;
        private Handler hand = new Handler();

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

            Button clickMe = (Button) findViewById(R.id.btn);

            backgroundLayout = (RelativeLayout) findViewById(R.id.background);

            clickMe.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View arg0) {

                    count = 0;

                    hand.postDelayed(changeBGThread, 3000);

                }
            });

        }

private Runnable changeBGThread = new Runnable() {

        @Override
        public void run() {

            if(count == 3){
                count = 0;
            }

            switch (count) {
            case 0:
                backgroundLayout.setBackgroundColor(getResources().getColor(android.R.color.black));
                count++;
                break;

            case 1:
                backgroundLayout.setBackgroundColor(Color.RED);
                count++;
                break;

            case 2:
                backgroundLayout.setBackgroundColor(Color.BLUE);
                count++;
                break;

            default:
                break;
            }

             hand.postDelayed(changeBGThread, 3000);

        }
    };
}

ここでは、非 UI スレッド、つまりbackgroundLayout.setBackgroundColor(Color.RED);run() 内で UI の背景を変更しています。どのように機能していますか?

4

1 に答える 1

15

ランナブルはバックグラウンド スレッドではなく、特定のスレッドで実行できる作業単位です。

ハンドラーは新しいスレッドを作成しません。作成されたスレッドのルーパー (この場合はメイン スレッド)、または作成中に指定したルーパーにバインドします。

したがって、バックグラウンド スレッドでは何も実行していません。ハンドラーでメッセージをキューに入れ、後でメイン スレッドで実行するだけです。

于 2013-10-03T11:52:11.710 に答える