繁体   English   中英

某些设备上的android UI滞后

[英]android UI lag on some devices

我有一个包含viewpager和导航抽屉的android项目。 在viewpager的每个片段中,我都有一个包含服务器负载数据的gridview! 我的问题是,从低硬件到功能强大的所有设备,一切都可以正常工作,但是在某些设备(例如galaxy s4和某些Sony xperia)中,它在滚动gridview或打开导航抽屉时会产生很大的延迟。 它出什么问题了?

PS:下面是gridview适配器的代码:

public View getView(int position, View convertView, ViewGroup parent) {
    if (convertView == null) {
        convertView = inflater.inflate(R.layout.grid_item, parent, false);
    }
    SimpleData item = myDatas.get(position);
    ((TextView) convertView.findViewById(R.id.title)).setText(item.getName());
    ImageView thumbnail = (ImageView) convertView.findViewById(R.id.thumbnail);
    thumbnail.getLayoutParams().height = thumbnail.getLayoutParams().width;

    if (item.getThumbnail() != null && !item.getThumbnail().isEmpty()) {
        if (item.getThumbnail().startsWith("http")) {
            Picasso.with(mContext)
                    .load(item.getThumbnail())
                    .placeholder(R.drawable.loading)
                    .into(thumbnail);
        } else {
            Picasso.with(mContext)
                    .load(Uri.fromFile(new File(item.getThumbnail())))
                    .placeholder(R.drawable.loading)
                    .into(thumbnail);
        }
    } else {
        thumbnail.setImageResource(R.drawable.noimage);
    }

    ((TextView) convertView.findViewById(R.id.province)).setText(item.getProvince());
    ((TextView) convertView.findViewById(R.id.likesCount)).setText(item.getLikesCount() + "");

    convertView.forceLayout();
    return convertView;
}

终于我找到了问题! 滞后的原因是代码的其他部分在UI线程的Line下方设置了图像:

 thumbnail.setImageResource(R.drawable.noimage);

因此,我用compress之一替换了可绘制的“ noimage”,并更改了这一行以使用Picasso加载文件,如下所示,一切正常。

 Picasso.with(mContext)
                .load(R.drawable.noimage)
                .placeholder(R.drawable.loading)
                .into(thumbnail);

谢谢大家的帮助。

您正在做很多事情,在这里不建议这样做,这可能是造成延迟的原因。

首先不要使用convertView.forceLayout(); ,根据其文档,它将强制您的布局在不需要时进行渲染。 其次,你膨胀convertView ,你应该做的是,在getView适配器的。 记住,您要重写一个类,而不是您要为布局夸大,它是由适配器类在较高级别自动完成的。

最后,您不使用以下形式的适配器设计模式:

if (convertView == null) {
  ...
} else {
  ...
}

有关后者的更多信息,请参考本文档 ,其中有一个ImageAdapter示例。

您的getView方法正在做很多事情,您应该了解如何在GridView中异步加载位图,并且这样做不会滞后。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM