5

私は多くの提案を試みましたが、何もうまくいきません! バックグラウンド スレッドで Thread.sleep() を呼び出すと、今回はメイン スレッドもフリーズします (アニメーション フレームのドロップ) :(

バージョン 1:

public void UpdateChannels(final ArrayList<Channel> channels)
{
    new AsyncTask<ArrayList<Channel>, Object[], Void>()
    {
        @Override
        protected Void doInBackground(ArrayList<Channel>... arrayLists)
        {
            for(Channel channel : arrayLists[0])
            {
                Integer chid = new Integer(channel.arfcn);
                ChannelRect channelRect = Channels.get(chid);
                publishProgress(new Object[] {channelRect, channel.dBm});

                try
                {
                    Thread.sleep(1000);
                } catch (InterruptedException e)
                {
                    e.printStackTrace();
                }
            }
            return null;
        }

        @Override
        protected void onProgressUpdate(Object[]... values)
        {
            ChannelRect channelRect = (ChannelRect) values[0][0];
            int value = (Integer)values[0][1];
            channelRect.setValue(value);
            channelRect.Animate();
        }
    }.execute(channels);
}

バージョン 2:

 public void UpdateChannels(final ArrayList<Channel> channels)
{
    new Thread(new Runnable()
    {
        @Override
        public void run()
        {
            for(final Channel channel : channels)
            {
                int chid = new Integer(channel.arfcn);
                final ChannelRect channelRect = Channels.get(chid);
                if(channelRect != null)
                {
                    CurrentActivity.runOnUiThread(new Runnable()
                    {
                        @Override
                        public void run()
                        {
                            channelRect.setValue(channel.dBm);
                            channelRect.Animate();
                        }
                    });
                    try
                    {
                        Thread.sleep(500);
                    } catch (InterruptedException e)
                    {
                        e.printStackTrace();
                    }
                }
            }
        }
    }).start();
}

そして、ポストとハンドラーで同じことを試しました。同じこと:( Thread.sleep(500) が到着すると、アニメーションがフリーズします:(

私が間違っているのは何ですか?

更新 1

UI スレッドを遅くする重い場所が見つかりました:

175 個の ChannelRect ビューを格納する水平 LinearLayout があります。animate を呼び出すと (AlphaAnimation はすべて正常に開始されますが、setValue() を ChannelRect に変更するときはサイズを変更する必要があります)。

public void setValue(int value)
{
    _value = value;
    setOpacity((byte)255);
    CurrentLayoutParams.height = (int)((-110 - value) * ycoeff * -1);
    requestLayout();
}

これは、メインの UI スレッドを遅くします。なんで?setValue は、すべてではなく、この LinearLayout の 1 つのビューにのみ影響します... ps requestLayot() 行を削除すると、速度が低下しますが、ChannelRect のサイズは変更されません:(

4

1 に答える 1

3

アニメーションがフリーズする理由は、ChannelRect の requestLayout() です。更新された子から呼び出された requestLayout() ですべての子を再描画しようとする多くの (175 以上) カスタム ビューを含むメイン LinearLayout。

ビュー内に四角形を描画するために ChannelRect を変更し、requestLayout() の代わりに Invalidate() を呼び出すようになりました。

public void setValue(int value)
{
    _value = value;
    setOpacity((byte)255);
    invalidate();
}

@Override
protected void onDraw(Canvas canvas)
{
    canvas.drawRect(0,getHeight() - (int)((-110 - _value) * ycoeff * -1),size,getHeight(), pnt);
}
于 2013-05-15T14:36:10.950 に答える