0

所以我的 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 时间):

  1. ImageView.setImageResource
  2. ImageView.resolveUri
  3. 资源.getDrawable
  4. Resources.loadDrawable
  5. Drawable.createFromResourceStream
  6. BitmapFactory.decodeResourceStream
  7. BitmapFactory.decodeStream
  8. 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"
        />

没有提供任何性能提升。

4

0 回答 0