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。