简体   繁体   English

AsyncTask冻结UI中的Android Thread.sleep()

[英]Android Thread.sleep() in AsyncTask freeze UI

i'm tried many suggestions but nothing works! 我尝试了很多建议,但没有任何作用! When i call Thread.sleep() in background thread, main thread also freezes for this time (Animation frame drop) :( 当我在后台线程中调用Thread.sleep()时,主线程也会冻结此时间(动画帧丢弃):(

Version 1: 版本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);
}

Version 2: 版本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();
}

And i tried same thing with post and Handler. 我和post和Handler尝试过同样的事情。 Same thing :( When Thread.sleep(500) arrives animation freezes :( 同样的事情:(当Thread.sleep(500)到达时动画冻结:(

What i'm doing wrong? 我做错了什么?

UPDATE 1 更新1

Found heavy place that slows UI thread: 发现减缓UI线程的繁重地方:

I have horizontal LinearLayout that stores 175 ChannelRect views. 我有水平LinearLayout存储175个ChannelRect视图。 When i call animate (that starts AlphaAnimation all okay, but when i setValue() to ChannelRect it must change his size: 当我调用animate时(启动AlphaAnimation一切都没问题,但是当我将setValue()设置为ChannelRect时,它必须改变他的大小:

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

This is slow downs main UI thread. 这是缓慢的主UI线程。 Why? 为什么? setValue affects only one view in this LinearLayout not all... ps removing requestLayot() line remove slowdowns but ChannelRect size not changes :( setValue仅影响此LinearLayout中的一个视图并非全部... ps删除requestLayot()行删除减速但ChannelRect大小不变:(

The reason why animation freezes it's a requestLayout() in ChannelRect. 动画冻结它的原因是ChannelRect中的requestLayout()。 Main LinearLayout that contains many (175+) custom views trying to redraw every children on requestLayout() called from updated child. 主LinearLayout包含许多(175+)个自定义视图,试图重新绘制从更新的子进程调用的requestLayout()上的每个子进程。

I'm changed my ChannelRect for drawing rectangle inside view and now calling Invalidate() instead requestLayout(): 我更改了我的ChannelRect以在视图中绘制矩形,现在调用Invalidate()而不是requestLayout():

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);
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM