我有一个应用程序需要在开始时使用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
循环中获取动画代码,动画将在后台线程完成后触发,而不是与后台线程同时发生。
如何在后台线程运行时保持动画的运行?
答案 0 :(得分:2)
使用该代码,它将成功阻止后续方法从触发开始直到后台进程完成,但是while循环中的动画将永远不会实际播放。
您正在绑定while
循环中的主应用程序线程。在此期间,您的UI将被冻结,就像您已在主应用程序线程上完成SVG一样。
我也尝试过使用不确定的ProgressBar来加载View,有和没有while循环(改为实际上没做任何事情),它会动画直到后台线程开始,此时它会冻结。 / p>
据推测,那是因为你用你的while
循环来绑定主应用程序线程,虽然我不太确定,因为我们没有这个代码。
如何在后台线程运行时保持动画的运行?
首先摆脱while
循环。
现在正在进行后台工作时,只有ProgressBar
可见 - 稍后,一旦您开始工作,您就可以尝试其他解决方案。将Thread
切换为AsyncTask
,并在onPostExecute()
的{{1}}中隐藏AsyncTask
并执行您需要执行的任何操作已转换的SVG。