所以我的 ListView 在我的手机上卡顿了,所以我使用 TraceView 来确定罪魁祸首。
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
View view = inflater.inflate(R.layout.menu_row, parent, false);
ViewHolder holder = new ViewHolder();
// setting other Views.
holder.icon = (ImageView) view.findViewById(R.id.icon);
view.setTag(holder);
return view;
}
@Override
public void bindView(View v, Context context, Cursor c) {
ViewHolder holder = (ViewHolder) v.getTag();
// getting other Views
String imgUrl = c.getString(6);
int resource = getResources().getIdentifier(imgUrl, "drawable", getActivity().getPackageName());
if (resource != 0) {
holder.icon.setImageResource(resource);
return;
}
}
正如预期的那样,newView 和 bindView 从我所有的方法调用中花费的时间最多。
- newView() 将所有时间都花在了 inflater.inflate(R.layout.menu_row, parent, false); 称呼
- bindView() 将所有时间都花在 holder.icon.setImageResource(resource);
我对 setImageResource 进行了更深入的研究,调用层次结构是这样的:(所有这些方法都占用了 99% 的 CPU 时间):
- ImageView.setImageResource
- ImageView.resolveUri
- 资源.getDrawable
- Resources.loadDrawable
- Drawable.createFromResourceStream
- BitmapFactory.decodeResourceStream
- BitmapFactory.decodeStream
- BitmapFactory.nativeDecodeAsset(这是self导致最多 cpu 时间的方法)。
我可以做些什么来优化我的 ListView?(我所有的图像的磁盘大小都不超过 15 KB)。
这是我正在设置 xml 的 ImageView:
<ImageView
android:id="@+id/icon"
android:layout_width="0dp"
android:layout_height="85dp"
android:layout_gravity="center_vertical"
android:layout_marginRight="10dp"
android:layout_weight="25"
android:adjustViewBounds="true"
android:contentDescription="@string/description_item"
android:minHeight="85dp"
android:minWidth="85dp"
android:scaleType="fitCenter"
/>
编辑:我已将 ImageView xml 更改为:
<ImageView
android:id="@+id/icon"
android:layout_width="85dp"
android:layout_height="85dp"
android:scaleType="center"
android:contentDescription="@string/description_item"
/>
没有提供任何性能提升。