onProgressUpdate执行

时间:2013-11-12 02:01:35

标签: android android-asynctask

我正在练习AsyncTask的工作,为此我想使用onProgressUpdate函数。目前在我的程序中,我有一个UI,允许用户选择一个输入(在TextView完成后显示在AsyncTask中)和一个计时器(确定Thread.sleep()时间在{ {1}})

我想要做的是......如果用户选择时间为5.然后在每过一秒我想向UI发送通知(其中调用进度对话框)...表示进度 5 of 5 ... 5 of 5 ... 3 of 5

以下是我迄今取得的进展:

AsyncTask

目前的实施只能直接给我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); } } 。谁能建议我一个解决方案?

1 个答案:

答案 0 :(得分: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对我来说会很好。