gpt4 book ai didi

android - 您如何清除确定的进度条以供重用?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:06:13 25 4
gpt4 key购买 nike

我有一个带有启动长时间运行任务的按钮的 Activity 。我使用 AsyncTask 执行任务并显示一个确定的 ProgressBar,该 ProgressBar 随着任务的进行而更新。第一次运行任务时一切正常,但在随后的运行中出现对话框,但已经是 100% 和 100/100。我在我的 Activity 中覆盖了 onCreateDialog 和 onPrepareDialog。我假设使用 setProgress(0) 会重置对话框,但这不起作用。我在 AsyncTask 的 onPreExecute 方法中使用 showDialog,在 AsyncTask 的 onPostExecute 中使用 dismissDialog。我能够让对话框重置的唯一方法是在 onPostExecute 中使用 removeDialog,但我不想重新创建对话框,因为我将重复使用几次。相关代码如下。这是 API 级别 10。

@Override
protected Dialog onCreateDialog(int id) {
switch (id) {
case PROGRESS_DIALOG:
progressDialog = new ProgressDialog(ProtoBufSerializationTestActivity.this);
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setCancelable(true);
progressDialog.setMax(100);
progressDialog.setMessage("Testing...");
return progressDialog;
default:
return null;
}
}

@Override
protected void onPrepareDialog(int id, Dialog dialog) {
super.onPrepareDialog(id, dialog);
switch (id) {
case PROGRESS_DIALOG:
ProgressDialog tmp = (ProgressDialog)dialog;
tmp.setProgress(0);
tmp.setSecondaryProgress(0);
return;
default:
Log.e("test", "Unknown dialog requested");
}
}

private class SerializationTestTask extends AsyncTask<Void, Integer, Long> {

@Override
protected void onPreExecute() {
showDialog(PROGRESS_DIALOG);
}

@Override
protected Long doInBackground(Void... params) {
long accumulator = 0;
int totalSize = 0;
for (int i = 0; i < 10000; i++) {
final long start = System.nanoTime();
//code to be timed
final long end = System.nanoTime();
accumulator += end - start;
if (i % 100 == 0) {
publishProgress(i);
}
}
return accumulator;
}

@Override
protected void onPostExecute(Long aLong) {
dismissDialog(PROGRESS_DIALOG);
results.setText(String.format("Serialized Message 10000 times.\nAverage time to serialize %.3fms", (double) aLong / 1e10));
}

@Override
protected void onProgressUpdate(Integer... values) {
progressDialog.incrementProgressBy(1);
}

编辑 在采纳@Arhimed 的建议后,我得到了以下代码。它要简单得多。我本可以使用 DialogFragment,但我认为在这种情况下没有必要。

private class SerializationTestTask extends AsyncTask<Void, Integer, Long> {
private ProgressDialog dialog;

@Override
protected void onPreExecute() {
dialog = ProgressDialog.show(ProtoBufSerializationTestActivity.this, "Serialization Test", "Testing...", false);
}

@Override
protected Long doInBackground(Void... params) {
long accumulator = 0;
int totalSize = 0;
for (int i = 0; i < 10000; i++) {
final long start = System.nanoTime();
//code to be timed
final long end = System.nanoTime();
accumulator += end - start;
if (i % 100 == 0) {
publishProgress(i);
}
}
return accumulator;
}

@Override
protected void onPostExecute(Long aLong) {
dialog.dismiss();
results.setText(String.format("Serialized Message 10000 times.\nAverage time to serialize %.3fms", (double) aLong / 1e10));
}

@Override
protected void onProgressUpdate(Integer... values) {
dialog.incrementProgressBy(1);
}
}

最佳答案

实际上 Arhimed 是对的,你不能这样做,但你可以用“肮脏”的方式强制进度条达到其零状态。对我来说,客户无论如何都希望进度条将其值归零,以防万一用户离开那个 Activity ,但在我的情况下,进度仍然存在,只是从开始重置。我有自定义进度可绘制和 setProgress 根本没有帮助我。所以我所做的就是打电话在实际设置 REAL drawable 之前使用此方法.就是这样..不幸的是,没有其他方法可以实现这一目标。

关于android - 您如何清除确定的进度条以供重用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11234946/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com