0

小さなAndroidアプリで使用するためにAndroidでカウントダウンタイマーを作成しようとしています。アプリは数秒から0までカウントダウンし、その時点で何らかのアクションを実行します。android.os.countdowntimerが提供するcoundowntimerを使用しています。これが私のコードです:

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.quizlayout);

    new CountDownTimer(30000, 1000) {

        TextView tx = (TextView) findViewById(R.id.textView2);

         public void onTick(long millisUntilFinished) {
             tx.setText("seconds remaining: " + millisUntilFinished / 1000);
         }

         public void onFinish() {
             tx.setText("done!");
         }
      }.start();
}

ただし、このカウントダウンタイマーは本当に遅いです。タイマーが1秒カウントダウンするのに3秒ほどかかります。何が起こっているのだろうか?私が上に持っているコードは、多かれ少なかれグーグルから直接コピーされています(CountDownTimer

誰かが私のタイマーがとても遅い理由に従って私を助けてくれますか、そしてそれを少しスピードアップする方法を提供できますか?

(編集):私はこれをエミュレーター、Intelアトムx86で実行しています。私はAndroid2.3.3環境をエミュレートしています。

4

3 に答える 3

1

カウントダウンタイマーのAndroidドキュメントによると

onTick(long)の呼び出しはこのオブジェクトに同期されるため、前のコールバックが完了する前にonTick(long)の呼び出しが1回発生することはありません。これは、onTick(long)の実装に、カウントダウン間隔と比較してかなりの時間がかかる場合にのみ関係します。

カウントダウンタイマーのこの例を見てください カウントダウンタイマーの例

または、新しいスレッドを生成して、そのスレッドを必要な間隔だけスリープさせ、ウェイクアップしたときにアクションを実行したり、その逆を行ったりすることもできます。

また、timertaskすることができます

于 2012-06-01T22:46:28.270 に答える
1

CountDownTimer は、UI 更新のパフォーマンスに関係なく効率的ではありません。UI を完璧に更新するには、カスタム カウントダウンを作成することをお勧めします。私は自分でやったので、ここにあります。私のアプリでは完璧です。

public abstract class CountDown {

int totalTime = 0;
int tickTime = 0;

Thread thread;
boolean canceled = false;

public CountDown(int totalTime,int tickTime){
    this.totalTime = totalTime;
    this.tickTime = tickTime;
}

public abstract void onTick();

public abstract void onFinish();

public void start(){

    thread = new Thread(new Runnable() {

        @Override
        public void run() {
            // Do in thread

            canceled = false;

            for (int elapsedTime = 0; elapsedTime < totalTime; elapsedTime += tickTime) {

                if(!canceled){

                        onTick();
                        try {
                            thread.sleep(tickTime);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }

                }else{
                    break;
                }
            }

            if(!canceled){
                onFinish();
            }

        }

    });

    thread.start();
}

public void cancel(){
    canceled = true;
}
}

UI を更新したり、runOnUiThread を呼び出したりする必要があるたびに、例外が発生することを忘れないでください。あなたはハンドラーではなく、UI スレッドでもありません。コードでの使用方法は次のとおりです。これは CountDownTimer と同じであるため、コード内の行の名前を変更するだけで済みます。

   CountDown cDown = new CountDown(10000, 20) {

        public void onTick() {

        // Do something

        }

        public void onFinish() {

            runOnUiThread(new Runnable() {
                @Override
                public void run() {

                    myButton.setImageDrawable(drawable);

                }
            });

        }
    };
于 2016-11-18T23:31:03.220 に答える
1

同じ runnable を投稿するハンドラーを使用します。これにより、余分なスレッドが不要になります。

Handler handler=new Handler();
handler.postRunnable(... , 1000) ;

runnable で、同じハンドラーに対して postRunnable を再度呼び出します (いつ停止するかの条件を追加します)。

于 2012-06-01T23:00:39.227 に答える