1

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

我遇到的问题是转换是相当密集的处理器,所以如果我在 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循环中取出,动画将在后台线程完成触发,而不是与后台线程同时触发。

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

4

1 回答 1

2

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

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

我还尝试使用不确定的 ProgressBar 来加载视图,无论有没有 while 循环(更改为实际上不做任何事情),它都会动画直到后台线程启动,此时它将冻结。

据推测,那是因为您将主应用程序线程与您的循环捆绑在一起while,尽管我不太确定这一点,因为我们没有此代码。

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

您首先要摆脱while循环。

ProgressBar在后台工作正在进行时,只需让一个可见 - 稍后,一旦你开始工作,你就可以尝试其他解决方案。将 切换ThreadAsyncTask,然后在onPostExecute()AsyncTask,隐藏ProgressBar并执行您需要对转换后的 SVG 执行的任何操作。

于 2013-01-23T00:17:00.103 回答