我想知道我使用的练习是否正确?请看看!
我正在使用AsyncTask调用Handler来动画(逐渐增加)ProgressBar中的进度。
我只能使用Handler为其设置动画,但我需要使用相同的Handler为多个ProgressBars制作动画。我没有发现传递参数的可能性" ProgressBar"对于一个处理程序,也没有声明一个全局变量(可能是数组?)看起来很干净。
所以我将ProgressBar作为参数传递给AsyncTask,然后在AsyncTask中,我定义了Handler,它使用名为publishProgress(int)的AsyncTask方法操作传递的ProgressBar。因此,每次调用AsyncTask实际上都等于为Handler提供一个唯一的传递ProgressBar。
我包含一个显示结构的精简代码:
public class animateProgress extends AsyncTask<ArrayList<ArrayList>, Integer, Boolean> {
ProgressBar pb;
int incrementProgress;
@Override
protected Boolean doInBackground(ArrayList<ArrayList>... arrayLists) {
ArrayList<ArrayList> gotArrayList = arrayLists[0]; //get passed arraylist
ArrayList<ProgressBar> alP = gotArrayList.get(1);
pb = alP.get(0); // REFERENCE TO PROGRESSBAR IS ACQUIRED HERE.
scoreCounter.postDelayed(scoreCounterUpdate, 0);
return null;
}
private Handler scoreCounter = new Handler();
private Runnable scoreCounterUpdate = new Runnable() {
public void run() {
if (MY_LOGIC_THAT_PROGRESS_SHOULD_INCREMENT) {
publishProgress(incrementProgress);
}
if (MY_LOGIC_THAT_WE_SHOULD_EXIT) {
scoreCounter.removeCallbacks(scoreCounterUpdate);
} else {
scoreCounter.postDelayed(this, 50);
}
}
};
@Override
protected void onProgressUpdate(Integer... values) {
pb.incrementProgressBy(values[0]);
super.onProgressUpdate(values);
}
}
代码完美无缺,但我担心的是我不应该使用AsyncTask或不使用Handler。 另外,我认为doInBackground()理论上应该在我调用scoreCounter.postDelayed()后完成,整个AsyncTask应该也是如此。但实际上,很多秒后由处理程序调用的publishProgress()仍然有效。这很令人困惑。