1

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そこにあるアニメーション コードをループから取り出すと、バックグラウンド スレッドと同時にではなく、バックグラウンド スレッドが終了した後にアニメーションが起動します。

バックグラウンド スレッドの実行中にアニメーションを続行するにはどうすればよいですか?

4

1 に答える 1

2

このコードを使用すると、バックグラウンド プロセスが完了するまで後のメソッドの起動を正常に保留できますが、while ループ内のアニメーションは実際には再生されません。

whileループ内のメイン アプリケーション スレッドを結び付けています。この間、メイン アプリケーション スレッドで SVG 作業を行ったかのように、UI はフリーズします。

また、whileループの有無にかかわらず、loadingViewに不確定なProgressBarを使用してみました(実際には何もしないように変更されました)。バックグラウンドスレッドが開始するまでアニメーション化され、その時点でフリーズします。

おそらく、これはメイン アプリケーション スレッドをwhileループに結び付けているためだと思われますが、このコードがないため、それについては確信が持てません。

バックグラウンド スレッドの実行中にアニメーションを続行するにはどうすればよいですか?

whileループを取り除くことから始めます。

バックグラウンド作業が進行している間は、ProgressBarを表示しておいてください。後で、それが機能するようになったら、他のソリューションを試すことができます。を に切り替え、でをThread非表示にして、変換された SVG で必要な処理を行います。AsyncTaskonPostExecute()AsyncTaskProgressBar

于 2013-01-23T00:17:00.103 に答える