2013-01-23 82 views
0

我有一个应用程序需要在开始时将很多SVG转换为Drawables,并使用svg-android的变体。如何在后台线程处于活动状态时保持动画运行?

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

这里是我的相关代码:

//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来加载视图,无论是否带有while循环(更改为实际上不做任何操作),并且它会动画直到后台线程启动,此时它将冻结。

如果我参加了动画代码的存在了while循环,动画会火后台线程完成,不能同时与后台线程。

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

回答

1

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

您正在绑定while循环中的主应用程序线程。在此期间,您的用户界面将被冻结,就像您在主应用程序线程中完成了SVG工作一样。

我也尝试使用一个不确定的进度为loadingView,既没有while循环(变更为实际上没有做任何事情),这将动画,直到后台线程启动,此时它会冻结。

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

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

您首先摆脱while循环。

只要有一个ProgressBar可见,而后台工作正在进行 - 稍后,一旦你有这个工作,你可以尝试其他解决方案。将Thread切换为AsyncTask,并在AsyncTask的中,将隐藏ProgressBar并执行任何需要对转换后的SVG执行的操作。

相关问题