安卓 - 我该如何测量ListView和其他视图的性能?

9
2个回答

2
我不知道如何计算FPS(我猜这应该是系统范围内完成的,而不是每个视图都计算),但您可以使用Hierarchy Viewer来分析每个View的性能。它以毫秒为单位提供测量、计算布局和绘制每个View所需时间,并通过显示黄色和红色圆圈来帮助您找到性能差的View对象。请注意保留HTML标签。

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。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接