Java Android视图交叉性问题
在我的项目中,我有很多异步任务,它们都遵循以下模式:Java Android视图交叉性问题,java,android,multithreading,android-asynctask,android-animation,Java,Android,Multithreading,Android Asynctask,Android Animation,在我的项目中,我有很多异步任务,它们都遵循以下模式: @Override protected void onPreExecute() { super.onPreExecute(); crossfade(progressBar, contentView);//hide content, show progress bar } @Override protected Void doInBackground(String... arg0) { //some work } p
@Override
protected void onPreExecute() {
super.onPreExecute();
crossfade(progressBar, contentView);//hide content, show progress bar
}
@Override
protected Void doInBackground(String... arg0) {
//some work
}
protected void onPostExecute(Void unused) {
crossfade(contentView, progressBar);
}
交叉淡入淡出代码:
void crossfade(View contentView, View loadingView){
Runnable r = new Runnable(){
@Override
public void run() {
if(contentView != null){
contentView.setAlpha(0f);
contentView.setVisibility(View.VISIBLE);
contentView.animate()
.alpha(1f)
.setDuration(CROSSFADE_TIME)
.setListener(null);
}
if(loadingView != null){
loadingView.animate()
.alpha(0f)
.setDuration(CROSSFADE_TIME)
.setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
if(loadingView != null){
loadingView.setVisibility(View.GONE);
}
}
});
}
}
};
runOnUiThread(r);
}
当asynctask的执行速度快于动画时间时,就会出现问题,导致在第一个crossfade调用完成之前进行第二次crossfade调用,导致两个视图都不可见
我尝试将可运行程序排队以按顺序执行它们,但问题是,如果用户单击了许多按钮或加载了许多片段(它们也使用crossfade方法),UI线程会过载,可能会使我的应用程序崩溃。到目前为止,我看到的唯一解决方案是使用Thread.sleep(CROSSFADE_TIME)为所有异步任务增加额外延迟,但这看起来像是一个非常肮脏的黑客行为,我不确定这是否是一个良好的用户体验。为什么要在单独的线程中运行CROSSFADE动画?尝试在不使用动画的情况下制作动画
Runnable r=new Runnable(){
和rununuithread(r);
如果将来有人需要,添加loadingView.animate().cancel()和contentView.animate().cancel()在动画取消以前的动画之前,一切正常。它都是在主线程上调用的,无论我是调用runOnUiThread还是在onPostExecute中直接调用它。我添加这一行只是为了方便起见,以防我在线程中调用crossfade而不是UI。