首先感谢您阅读本文。我无法通过 AsyncTask 内部类从自定义 ProgressBar 更新进度。我使用 9patch 作为背景和进度可绘制对象。它只是不更新。它保持在那里,就像它在最大值中一样,我正在使用 onProgressUpdate() 来调用 invalidate() 并更新 UI 线程。
这就是它现在的样子,它变得可见并且只是呆在那里全部填满:http: //imageshack.us/photo/my-images/651/mobicashprogressbar.png/
- 进度条应该仅在用户结束表单后可见。
- 还有另一个内部 AsyncTask 处理与 Web 服务连接的发送 SMS 按钮。
代码如下:
public void setTimerProgress(int progress){
progressBar.setProgress(progress);
}
public void updateProgress(){
progressBar.invalidate();
}
public void showProgress(){
progressBar.setVisibility(View.VISIBLE);
}
//Classe auxiliar para controle da progress bar
private class TimerProgress extends AsyncTask<Void, Void, Void>{
private int start;
private final int OTP_TIMEOUT = 900000;
@Override
protected void onPreExecute() {
super.onPreExecute();
showProgress();
start = (int) System.currentTimeMillis();
}
@Override
protected Void doInBackground(Void... param) {
int timer = (int) System.currentTimeMillis() - start;
while (timer <= OTP_TIMEOUT){
setTimerProgress(timer);
timer = (int) System.currentTimeMillis() - start;
publishProgress();
}
return null;
}
@Override
protected void onProgressUpdate(Void... values) {
super.onProgressUpdate(values);
updateProgress();
}
}
这是 XML:
<ProgressBar
style="@android:style/Widget.ProgressBar.Horizontal"
android:layout_gravity="center_horizontal"
android:visibility="invisible"
android:id="@+id/progress_bar_timer"
android:max="900000"
android:progress="3000"
android:progressDrawable="@drawable/progress_bar"
android:background="@drawable/progress_background"
android:layout_width="fill_parent"
android:layout_height="25dip"
android:layout_marginRight="73sp"
android:layout_marginLeft="70sp">
</ProgressBar>
这是我称之为的一个地方
@Override
public void onClick(View v) {
if (v.getId() == R.id.refresh_otp) {
saveParametersForOTP();
if (edtIniPin.getText().length() == pinLengthInt) {
try {
disableEditText(edtIniPin);
disableEditText(edtValue);
edtOTP.setText(Facade.getInstance().nextOTP(Facade.getInstance().getPin(), Facade.getInstance().getValue()));
//Inicia o timer da progressbar
new TimerProgress().execute();
帮助?:D
更新:
对于测试目的,我将 OTP_TIMEOUT 设置为 50000,对代码进行了以下更改并删除了 9patch 可绘制属性,因此它将使用本机可绘制栏。但是,它可以工作,当我使用图像来自定义栏时,它似乎正在发生同样的老问题。它是静态的,像以前一样被填满。
private final int OTP_TIMEOUT = 50000;
@Override
protected void onPreExecute() {
super.onPreExecute();
Log.i("PROGRESS", "Chegou no PreExecute!");
showProgress();
ENABLE_REFRESH = false;
start = (int) System.currentTimeMillis();
}
@Override
protected Void doInBackground(Void... param) {
int timer = (int) System.currentTimeMillis() - start;
while (timer <= OTP_TIMEOUT){
Log.i("PROGRESS", "Chegou no while!");
setTimerProgress((int)timer);
timer = (int) System.currentTimeMillis() - start;
publishProgress();
if (timer >= OTP_TIMEOUT) {
ENABLE_REFRESH = true;
}
}
return null;
}
@Override
protected void onProgressUpdate(Void... values) {
super.onProgressUpdate(values);
Log.i("PROGRESS", "Chegou no Progress Update!");
updateProgress();
}