0

アプリケーションで設定したカウントダウンを完了するためのより良い戦術があるに違いありませんが、Thread.sleep(1000)すべての桁の間を使用することがうまくいくことは明らかでした。それはしませんでしたし、私はまだ他の解決策を持っていません. アプリを実行すると、カウントダウンが 5 から 1 秒で 1 になります。

これは私のコードです:

bBegin.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

           bBegin.setText("5");

            try{
                Thread.sleep(1000);
            }catch(InterruptedException ie){

            }


            bBegin.setText("4");

            try{
                Thread.sleep(1000);
            }catch(InterruptedException ie){

            }

            bBegin.setText("3");

            try{
                Thread.sleep(1000);
            }catch(InterruptedException ie){

            }

            bBegin.setText("2");

            try{
                Thread.sleep(1000);
            }catch(InterruptedException ie){

            }

            bBegin.setText("1");

            try{
                Thread.sleep(1000);
            }catch(InterruptedException ie){

            }
}

ありがとう、私はこの問題が私のような他の初心者に役立つことを願っています(そして心配しないでください、私は以前の解決策についてサイトをチェックしました)

4

3 に答える 3

2

Sleep は何も「スキップ」しません。代わりに、このコードは、メソッドが終了するまで (メソッドが 5 回すべてスリープした後) 、UI が更新されないようにします。

onClick メソッドが終了した後、UI ディスパッチが操作を再開できる時点で、UI が更新されます。この更新が発生すると、最後に割り当てられた値で表示が更新され、コードが「スキップされた」という誤った結論につながります。ただし、メソッド内のすべてのコードは実行されました

これは非常に重要なルールにつながります:メイン UI スレッドでスリープしないでください。これを行うと、ユーザーの操作がブロックされ、UI イベント/ディスパッチ キューがブロックされるため、表示の更新がブロックされます。クリック リスナーなどのすべての標準 UI コールバックは、UI スレッドで発生します。

スリープ必要な場合 (ゲームやカスタム キャンバスの場合など)、スリープは別の (UI 以外の) スレッドで行われるため、このような主要な UI のブロック動作は発生しません。

于 2013-09-13T00:36:00.040 に答える
0
**As in the attached code snippet it is showing user thread is trying to update UI Thread.which is not a good practice..
i have done same using the concept of Handler.
the code snipper is ..**


public class MainActivity extends Activity {
    TextView tv;
    Button b1;
    Handler handler;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv=(TextView) findViewById(R.id.textView1);
        b1=(Button) findViewById(R.id.button1);
        handler= new Handler();


        b1.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {

                Runnable r=new Runnable() {
                    int   mynumber=5;
                    @Override
                    public void run() {
                        while(mynumber >0){
                            try {
                                Thread.sleep(1000);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                            handler.post(new Runnable() {
                                public void run() {
                                    tv.setText("remaining time  is "+mynumber );
                                }
                            });

                            mynumber--;
                        }
                    }
                };

                new Thread(r).start();
            }
        });


    }

}
于 2013-09-13T02:42:17.017 に答える