Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java AsyncTask冻结UI中的Android Thread.sleep()_Java_Android_Multithreading_Freeze_Thread Sleep - Fatal编程技术网

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

Java AsyncTask冻结UI中的Android Thread.sleep(),java,android,multithreading,freeze,thread-sleep,Java,Android,Multithreading,Freeze,Thread Sleep,我尝试了很多建议,但都不管用!当我在后台线程中调用Thread.sleep()时,主线程这次也会冻结(动画帧下降):( 第1版: public void UpdateChannels(final ArrayList<Channel> channels) { new AsyncTask<ArrayList<Channel>, Object[], Void>() { @Override protected Void

我尝试了很多建议,但都不管用!当我在后台线程中调用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);
}
这会减慢主UI线程。为什么?setValue只影响此线性布局中的一个视图,而不是所有视图。。。
p、 s.removing requestLayout()行removing Slowdown但ChannelRect大小不变:(

动画冻结的原因是ChannelRect中的requestLayout()。 Main LinearLayout,包含许多(175+)自定义视图,试图重新绘制从更新的子视图调用的requestLayout()上的每个子视图

我更改了在视图内部绘制矩形的ChannelRect,现在调用Invalidate()而不是requestLayout():


该问题与此代码无关channelRect.setValue(value)或channelRect.Animate()中没有繁重的代码我从未说过它在那里。我试图删除任何繁重的代码,活动中没有任何工作,我尝试更改睡眠时间,动画冻结时间与线程类似。睡眠时间…C#中的同一代码工作正常线程。睡眠将在指定的时间内暂停当前线程,如果线程负责更新动画,则t动画将是不稳定的。例如,AsyncTask每1秒只发布一次进度-这意味着您只能获得1fps的动画帧速率。在此等待时间内,UI线程可能仍有响应。
 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();
}
public void setValue(int value)
{
    _value = value;
    setOpacity((byte)255);
    CurrentLayoutParams.height = (int)((-110 - value) * ycoeff * -1);
    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);
}