如何在后台线程处于活动状态时保持动画运行?

时间:2013-01-23 00:07:40

标签: android multithreading android-animation

我有一个应用程序需要在开始时使用svg-android的变体将很多SVG转换为Drawables。

我遇到的问题是转换是相当处理器密集的,所以如果我在UI线程上运行它,一切都会在发生时暂停10秒左右。我已经尝试将转换移动到后台线程,但这会导致一些奇怪,因为在所有Drawables完成之前,依赖于Drawables数组的其他一些方法会触发。我尝试过几个不同的事情来加载动画,但是当后台进​​程处于活动状态时它们不会动画。

这是我的相关代码:

//get and resize SVGs
new Thread(new Runnable(){
    public void run(){
       for (int i=0;i<drawablesArray.length;i++){
            SVG vector = SVGParser.getSVGFromResources(getResources(),resourceArray[i]);
            Drawable drawable = new PictureDrawable(vector.resizePicture(height,width); //resize picture is a custom function in SVG-Android
            drawablesArray[i]=drawable;
        }
    }
}).start();

while(drawablesArray[20]==null){
    loadingView.animate().setDuration(100).rotationBy(25);
}

使用该代码,它将成功阻止后续方法从触发到后台进程完成,但while循环中的动画将永远不会实际播放。我也尝试使用不确定的ProgressBar进行loadingView,无论是否有while循环(改为实际上都没有做任何事情),它会动画直到后台线程开始,此时它会冻结。

如果我从while循环中获取动画代码,动画将在后台线程完成后触发,而不是与后台线程同时发生。

如何在后台线程运行时保持动画的运行?

1 个答案:

答案 0 :(得分:2)

  

使用该代码,它将成功阻止后续方法从触发开始直到后台进程完成,但是while循环中的动画将永远不会实际播放。

您正在绑定while循环中的主应用程序线程。在此期间,您的UI将被冻结,就像您已在主应用程序线程上完成SVG一样。

  

我也尝试过使用不确定的ProgressBar来加载View,有和没有while循环(改为实际上没做任何事情),它会动画直到后台线程开始,此时它会冻结。 / p>

据推测,那是因为你用你的while循环来绑定主应用程序线程,虽然我不太确定,因为我们没有这个代码。

  

如何在后台线程运行时保持动画的运行?

首先摆脱while循环。

现在正在进行后台工作时,只有ProgressBar可见 - 稍后,一旦您开始工作,您就可以尝试其他解决方案。将Thread切换为AsyncTask,并在onPostExecute()的{​​{1}}中隐藏AsyncTask并执行您需要执行的任何操作已转换的SVG。