我尝试了很多建议,但没有任何效果!当我在后台线程中调用 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 视图的水平 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 中的一个视图,而不是全部... ps 删除 requestLayot() 行会消除减速,但 ChannelRect 大小不会改变:(