1

UIに表示されるカウントダウンタイマーを実装しようとしています。これはクリーンでエレガントなソリューションだと思いましたが、Logcatがスローします

AndroidRuntime(3282): java.lang.RuntimeException: An error occured while executing doInBackground()

private class UpdateCountdownTask extends AsyncTask<Long, Long, Void> {
    @Override
    protected Void doInBackground(Long... millisUntilFinished) {

        new CountDownTimer(millisUntilFinished[0], 1000) {

            @Override
            public void onTick(long millisUntilFinished) {
                publishProgress(millisUntilFinished);
            }

            @Override
            public void onFinish() {
                ((TextView) findViewById(R.id.answer)).setText(answer);
            }
        };
        return null;
    }

    @Override
    protected void onProgressUpdate(Long... millisUntilFinished) {
        super.onProgressUpdate(millisUntilFinished);
        ((TextView) findViewById(R.id.timer)).setText(""
                + millisUntilFinished[0] / 1000);
    }
}

まだスレッドを完全には理解していません。誰が私が間違っているのか教えてもらえますか?

ありがとう。

更新: 申し訳ありません。私は絶対的な無能です。カウンターでメソッド start() を呼び出すのを忘れていました。:PI は最終的に、CountDownTimer だけでカウントダウンを実装することにしました。これが実際に別のスレッドで実行されるかどうかはわかりませんが、現在は機能しています。

    CountDownTimer myCounter = new CountDownTimer(millisUntilFinished, 1000) {

        @Override
        public void onTick(long millisUntilFinished) {
            ((TextView) findViewById(R.id.timer)).setText(""
                    + millisUntilFinished / 1000);
            System.out.println("I am ticking");
        }

        @Override
        public void onFinish() {
        }
    };

    myCounter.start();
4

3 に答える 3

3

問題は CountDownTimer 内の onFinish() メソッドだと思います。ここでは UI スレッドを変更していますが、これをバックグラウンド スレッドから行うことはできません。したがって、((TextView) findViewById(R.id.answer)).setText(answer);onPostExecute() メソッド内に配置する必要があります。つまり:

protected void onPostExecute(String result) {
super.onPostExecute(result);
((TextView) findViewById(R.id.answer)).setText(answer);
}

これがうまくいくことを願っています。

于 2012-05-02T11:24:48.567 に答える
0

Handler を使用して UI を毎秒更新することを検討しましたか?

チェックアウトhttp://developer.android.com/resources/articles/timed-ui-updates.html

于 2012-05-02T11:27:48.883 に答える
0

バックグラウンドで何かをしているときにUIを接続することはできません.私の意見では、スレッドを使用すると、あなたが望むことが可能になります.これにより、作業がはるかに簡単になります.小さなコードを以下に示します.これを願っています.あなたを助けるかもしれません。代わりに、テキストを設定できる画像を設定しようとしています。ここでは、スレッドとハンドラーを使用して実行しました。スレッド内で UI を接続することは不可能です。スレッド。それが、ここでエラーが発生する理由です。それ以外の場合は、Postexecute()

Thread animator = new Thread() {
        public void run() {
            int i = 0;
            try {
                sleep(2000);
                while (i < 4) {
                    sleep(50);
                    handler.sendMessage(handler.obtainMessage(i));
                    i++;
                }
            } catch (Exception e) {

            }
        }
    };
    animator.start();
    handler = new Handler() {

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if (msg.what == 0) {
                animatedimage.setImageResource(R.drawable.sub1);
            } else if (msg.what == 1) {
                animatedimage.setImageResource(R.drawable.sub2);
            } else if (msg.what == 2) {
                animatedimage.setImageResource(R.drawable.sub3);
            } else if (msg.what == 3) {
                animatedimage.setImageResource(R.drawable.sub4);
            }
        }

    };
于 2012-05-02T11:25:27.323 に答える