我创建了一个自定义复合视图,其中包含一些TextView
和一个ProgressBar
。添加这些组件后,我启动动画以完成视图入口。我还定义了一个AnimationListener
,当动画完成时,它会启动一个AsyncTask
,用于动画ProgressBar
。这就是我所做的。添加内部组件后,我有这个动画:
Animation animation = AnimationUtils.loadAnimation(getContext(),
mAnimationId);
animation.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationRepeat(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
new ProgressTak().execute();
}
});
startAnimation(animation);
这是AsyncTask
:
class ProgressTak extends AsyncTask<Void, Integer, Void> {
Handler handler = new Handler();
@Override
protected Void doInBackground(Void... params) {
for (int i = 0; i < mProgress; i++) {
i++;
publishProgress(i);
try {
Thread.sleep(30);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return null;
}
@Override
protected void onProgressUpdate(Integer... values) {
progressBar.setProgress(values[0]);
}
}
一切正常。但问题是当我将自定义视图的两个实例添加到活动时,第二个活动中的进度条动画在第一个活动中的进度条动画完成时开始。但我希望他们同时行动。我该怎么办?
谢谢
答案 0 :(得分:2)
首次引入时,AsyncTasks在单个后台线程上串行执行。从DONUT开始,这被改为一个线程池,允许多个任务并行运行。从HONEYCOMB开始,任务在单个线程上执行,以避免由并行执行引起的常见应用程序错误。
如果您真的想要并行执行,可以使用THREAD_POOL_EXECUTOR调用executeOnExecutor(java.util.concurrent.Executor,Object [])。
所以你应该做类似
的事情new ProgressTak().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
希望这有帮助