1

の働きを練習していて、AsyncTaskその目的で機能を使いたかったのonProgressUpdateです。現在、私のプログラムには、ユーザーが入力(終了TextView後に表示されるAsyncTask)とタイマー(Thread.sleep()で時間を決定するAsyncTask)を選択できるUIがあります。

私がやりたいことは...ユーザーが5の時間を選択した場合です。その後、1秒ごとにUIに通知を送信したいと思います(進行状況ダイアログが呼び出される場所)... 5分の1の進行状況を示します... 2/5 ... 3/5 .

これまでの進捗状況は次のとおりです。

public class ViewFiller extends AsyncTask<String, Integer, String> {

    @Override
    protected String doInBackground(String... input) {
        // TODO Auto-generated method stub
        try {
            int time;
            if (input[1].equalsIgnoreCase("")) {
                time = 0;
            } else {
                time = Integer.parseInt(input[1]) * 1000;
                for (int i = 1; i <= time / 1000; i++) {
                    publishProgress(i, time);
                }
                Thread.sleep(time);
            }

        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return input[0];
    }

    @Override
    protected void onPostExecute(String result) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);
        execute.setText("Execute");
        progress.dismiss();
        tvInput.setText(result);
    }

    @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        super.onPreExecute();
        execute.setText("Running...");
        displayProgress("Updating field ... ");
        // Start the progress dialog
        progress.show();

    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        // TODO Auto-generated method stub
        super.onProgressUpdate(values);
        progress.setMessage("Updating field ... " + values[0] + " of "
                + values[1] / 1000);
    }

}

現在の実装は私5 of 5に直接与えるだけです。誰かが私に解決策を提案できますか?

4

1 に答える 1

2

loopそれはあなたが見るよりも速くあなたを通り抜けているからです

for (int i = 1; i <= time / 1000; i++) {
                publishProgress(i, time);

そこは必要ありませんloop。どれだけsleepの時間でも、進行状況を表示し、sleep()publishProgress()を に入れloopます。何かのようなもの

try {
       int time = 0;
       for (int i = 1; i <= time / 1000; i++) {

        if (input[1].equalsIgnoreCase("")) {
            time = 0;
        } else {
            time = Integer.parseInt(input[1]) * 1000;
                publishProgress(time);
            }
            Thread.sleep(time);
        }

inputただし、実際に何が含まれているかはわかりませんが、必要になる場合がありますinput[i]。それ以外の場合は、常に同じになるようです。

また、これにはCountDownTimerが適していると思います。

于 2013-11-12T02:11:32.213 に答える