应用程序滞后于安卓:layerType= "software"



我正在制作一个非常简单的应用程序(基本上是一个只有几个图像的列表视图)。在我的测试设备上(一部摩托罗拉Moto G,自带安卓系统),它的表现总体上还不错。

然而,我希望我的ListView有点分隔符。因此,我制作了一个list_divider.xml文件来定义分隔符,并将其设置为在ListView中使用的分隔符。我在我的Moto G上试用过,但没有显示虚线。

所以我用谷歌搜索了一下,找到了这个问题的解决方案。为视图禁用hw加速解决了错误并正确显示分隔符。

然而,现在我有另一个问题:由于禁用了hw加速,应用程序在滚动时开始延迟。

是否有一个解决方案,有一个点分隔符,而不是禁用如何加速或至少有性能几乎一样好,因为禁用它之前?

编辑:这是我使用的适配器代码:

public class AstronautArrayAdapter extends ArrayAdapter<Astronaut> {
    public static final String TAG = "AstronautArrayAdapter";
    public AstronautArrayAdapter(Context context, List<Astronaut> objects) {
        super(context, R.layout.astronauts_list_row, objects);
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        RowViewHolder holder = null;
        if (convertView == null) {
            LayoutInflater inflater = ((Activity) getContext()).getLayoutInflater();
            convertView = inflater.inflate(R.layout.astronauts_list_row, parent, false);
            holder = new RowViewHolder();
                holder.name = (TextView) convertView.findViewById(R.id.nameOfAustronaut);
            holder.daysInSpace = (TextView) convertView.findViewById(R.id.numberOfDaysInSpace);
            holder.country = (ImageView) convertView.findViewById(R.id.countryImage);
            holder.title = (TextView) convertView.findViewById(R.id.titleOfAstronaut);
            convertView.setTag(holder);
        } else {
            holder = (RowViewHolder) convertView.getTag();
        }
        Astronaut astronaut = getItem(position);
        holder.name.setText(astronaut.getName());
        holder.daysInSpace.setText(Integer.toString(astronaut.getDaysInSpace()));
        holder.country.setImageBitmap(astronaut.getCountryImage(getContext()));
        holder.title.setText(astronaut.getTitle());
        return convertView;
    }
    private static class RowViewHolder {
        TextView name;
        TextView daysInSpace;
        ImageView country;
        TextView title;
    }
}
编辑2:下面是两个有问题的布局文件:

activity_main.xml

<ListView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/astronautsList"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" 
    android:padding="16dp"
    android:dividerHeight="3dp"
    android:divider="@drawable/list_divider"
    android:layerType="software" />

list_divider.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="line" >
    <stroke
        android:width="1px"
        android:color="@android:color/black"
        android:dashWidth="5px"
        android:dashGap="1px" />
    <size android:height="3dp" />
</shape>

您看到的延迟的可能答案是:

dependencies部分中的这行添加到build.gradle

compile 'com.squareup.picasso:picasso:2.3.2'

并替换这一行

holder.country.setImageBitmap(astronaut.getCountryImage(getContext()));

Picasso.with(context).load(/* insert the URL here */).into(holder.country);

并删除下载所有图像并在本地保存的代码。Picasso自动下载/解码位图,并为您管理磁盘和ram缓存。

ps:

如果你不使用Gradle:

    你应该切换到Android-Studio并使用Gradle
  1. 忘记我说过的在gradle文件中添加这一行,从他们的网站上下载jar文件,放到libs文件夹中,并确保打乱项目设置,以确保jar进入你的APK(老实说,我不记得这些设置是如何工作的,因为我很久以前就放弃了Eclipse)

正如您没有提到的,您是否实现了ViewHolder模式?

当ListView回收视图时,它必须膨胀布局并插入任何文本和图像。你通常在这段代码中调用findViewById,这是非常昂贵的。ViewHolder模式解决了这个问题,并且很容易实现。

看这里的一个伟大的教程由谷歌

http://developer.android.com/training/improving-layouts/smooth-scrolling.html

最新更新