Java 使用AsyncTask调用处理程序。这是好的做法吗?
我想知道我正在使用的练习是否正确?请看一看 我使用AsyncTask调用一个处理程序来设置进度条中进度的动画(随时间逐渐递增) 我只能使用处理程序设置动画,但我需要使用同一个处理程序设置多个ProgressBar的动画。我发现不可能将参数“ProgressBar”传递给处理程序,声明全局变量(可能是数组?)看起来也不干净 因此,我将ProgressBar作为参数传递到AsyncTask中,然后在AsyncTask中,我定义了处理程序,该处理程序使用名为publishProgress(int)的AsyncTask方法操纵传递的ProgressBar。因此,对AsyncTask的每次调用实际上等同于为处理程序提供一个唯一传递的ProgressBar 我包括一个精简的代码,其中显示了结构:Java 使用AsyncTask调用处理程序。这是好的做法吗?,java,android,android-asynctask,handler,runnable,Java,Android,Android Asynctask,Handler,Runnable,我想知道我正在使用的练习是否正确?请看一看 我使用AsyncTask调用一个处理程序来设置进度条中进度的动画(随时间逐渐递增) 我只能使用处理程序设置动画,但我需要使用同一个处理程序设置多个ProgressBar的动画。我发现不可能将参数“ProgressBar”传递给处理程序,声明全局变量(可能是数组?)看起来也不干净 因此,我将ProgressBar作为参数传递到AsyncTask中,然后在AsyncTask中,我定义了处理程序,该处理程序使用名为publishProgress(int)的A
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);
}
}
public类animateProgress扩展异步任务{
ProgressBar-pb;
整数递增进度;
@凌驾
受保护的布尔doInBackground(ArrayList…ArrayList){
ArrayList gotArrayList=arrayLists[0];//通过ArrayList
ArrayList alP=gotArrayList.get(1);
pb=alP.get(0);//此处获取对PROGRESSBAR的引用。
scoreCounter.postDelayed(scoreCounterUpdate,0);
返回null;
}
私有处理程序scoreCounter=新处理程序();
private Runnable scoreCounterUpdate=new Runnable(){
公开募捐{
如果(我的逻辑,即进度,应增加){
出版进度(递增进度);
}
如果(我的逻辑是我们应该退出){
scoreCounter.removeCallbacks(scoreCounterUpdate);
}否则{
计分器。延迟后(本,50);
}
}
};
@凌驾
受保护的void onProgressUpdate(整型…值){
pb.incrementProgressBy(值[0]);
super.onProgressUpdate(值);
}
}
代码工作得很好,但我担心的是,我不应该使用AsyncTask,也不应该使用Handler。
另外,我认为doInBackground()理论上应该在调用scoreCounter.postDelayed()后立即完成,整个异步任务也应该完成。但实际上,处理程序在几秒钟后调用的publishProgress()仍然有效。这令人困惑