gpt4 book ai didi

java - AsyncTask 卡住 UI 中的 Android Thread.sleep()

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:57:02 26 4
gpt4 key购买 nike

我尝试了很多建议,但没有任何效果!当我在后台线程中调用 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();
}

我对 post 和 Handler 进行了同样的尝试。同样的事情 :( 当 Thread.sleep(500) 到达时动画卡住 :(

我做错了什么?

更新 1

发现拖慢 UI 线程的沉重地方:

我有存储 175 个 ChannelRect View 的水平 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 中的一个 View 而不是所有......附:删除 requestLayot() 行删除减速但 ChannelRect 大小不变 :(

最佳答案

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

我更改了 ChannelRect,以便在 View 内绘制矩形,现在调用 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);
}

关于java - AsyncTask 卡住 UI 中的 Android Thread.sleep(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16564869/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com