我正在练习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);
}
}
。谁能建议我一个解决方案?
答案 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对我来说会很好。