[英]Android Thread.sleep() in AsyncTask freeze UI
我尝试了很多建议,但没有任何作用! 当我在后台线程中调用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线程的繁重地方:
我有水平LinearLayout存储175个ChannelRect视图。 当我调用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中的一个视图并非全部... ps删除requestLayot()行删除减速但ChannelRect大小不变:(
动画冻结它的原因是ChannelRect中的requestLayout()。 主LinearLayout包含许多(175+)个自定义视图,试图重新绘制从更新的子进程调用的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.