如何衡量ListView
的费用?
请参阅http://code.google.com/events/io/2010/sessions/world-of-listview-android.html中的幻灯片13-17。
答案 0 :(得分:2)
我不知道计算FPS(我想这应该在整个系统范围内完成,而不是按视图计算),但您可以使用Hierarchy Viewer来分析每个View
的效果。它为您提供了测量,计算布局和绘制每个View
所需的时间(以毫秒为单位),并通过显示黄色和红色圆圈表示性能不佳,帮助您找到慢View
个对象。
答案 1 :(得分:0)
您可能对此ListAdapter感兴趣,它将包装另一个ListAdapter并打印出有关每秒显示的视图数量的日志语句。
import android.database.DataSetObserver;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListAdapter;
public class VpsAdapter implements ListAdapter {
protected int vpsViewCount = 0;
protected long vpsStartTimeNanos = System.nanoTime();
protected ListAdapter delegate;
public VpsAdapter(ListAdapter delegate) {
super();
this.delegate = delegate;
}
public void resetViewsPerSecond() {
vpsViewCount = 0;
vpsStartTimeNanos = System.nanoTime();
}
public double getViewsPerSecond() {
final long now = System.nanoTime();
return (vpsViewCount / (double)(now - vpsStartTimeNanos)) * 1e9;
}
public int getViewsPerSecondViewCount() {
return vpsViewCount;
}
@Override
public boolean areAllItemsEnabled() {
return delegate.areAllItemsEnabled();
}
@Override
public int getCount() {
return delegate.getCount();
}
@Override
public Object getItem(int i) {
return delegate.getItem(i);
}
@Override
public long getItemId(int i) {
return delegate.getItemId(i);
}
@Override
public int getItemViewType(int i) {
return delegate.getItemViewType(i);
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
++vpsViewCount;
Log.d("VpsAdapter", String.format("VpsAdapter: %.2f views per second (%s views)", getViewsPerSecond(), getViewsPerSecondViewCount()));
return delegate.getView(i, view, viewGroup);
}
@Override
public int getViewTypeCount() {
return delegate.getViewTypeCount();
}
@Override
public boolean hasStableIds() {
return delegate.hasStableIds();
}
@Override
public boolean isEmpty() {
return delegate.isEmpty();
}
@Override
public boolean isEnabled(int i) {
return delegate.isEnabled(i);
}
@Override
public void registerDataSetObserver(DataSetObserver dataSetObserver) {
delegate.registerDataSetObserver(dataSetObserver);
}
@Override
public void unregisterDataSetObserver(DataSetObserver dataSetObserver) {
delegate.unregisterDataSetObserver(dataSetObserver);
}
}
要使用,只需将现有的ListAdapter包装在VpsAdapter中,例如
setListAdapter( new VpsAdapter( myAdapter ) );
然后在准备好开始计时时调用resetViewsPerSecond()
,在准备好检索结果时调用getViewsPerSecond()
。每次调用getView()
时,适配器还会向控制台记录当前的vps。
我将此适配器与ListView.smoothScrollTo( adapter.getCount()-1 )
结合使用,以便以编程方式将列表视图滚动到底部并获得平均vps。