Отображение textview settext очень медленное исполнение с длинным текстом

Я пытаюсь отобразить длинный текст с помощью TextView в приложении для Android (максимум около 300 КБ), и производительность на Nexus 7 ужасна (около 10 секунд). Текст можно прокручивать, поэтому мы разделили его на более мелкие части и попытались отобразить их в ListView (используя шаблон ViewHolder). Производительность повышается, но анимация прокрутки по-прежнему ОЧЕНЬ прерывистая. На самом деле производительность с чистым текстом неприемлема (Nexus 7 не самое медленное устройство), но в конце концов мы будем использовать стилизованный текст (используя SpannableString), что полностью убьет производительность.

Я показываю скрины systrace ниже (собственно ссылки, извините за это, но у меня нет репутации загружать картинки :)):

Я знаю, что рендеринг текста — нетривиальная задача, но iOS с ней прекрасно справляется, так почему же Android не может? И есть ли разумное решение этой проблемы?

Аппаратное ускорение включено.

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    ViewHolder holder = null;
    if (convertView == null) {
        holder = new ViewHolder();
        convertView = mInflater.inflate(R.layout.element_item_layout, parent, false);
        //element_item_layout file is/contains only one TextView, as below
        holder.textView = (TextView) convertView.findViewById(R.id.element_item_textview);
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder)convertView.getTag();
    }

    holder.textView.setText(getItem(position).longText);

    return convertView;
}

private class ViewHolder {
    public TextView textView;
}

person Andrzej Dąbrowski    schedule 03.11.2014    source источник
comment
Можете ли вы опубликовать свой код?   -  person reactivemobile    schedule 03.11.2014
comment
частный класс ViewHolder расширяет ViewHolder {} Как это возможно??   -  person Chitrang    schedule 03.11.2014
comment
извините, это была опечатка после очистки кода для этого вопроса, исправлено   -  person Andrzej Dąbrowski    schedule 03.11.2014
comment
Ok. Не пробовал ваш код, так как у меня нет этого ДЛИННОГО текста. Ваша идея разделить его на более мелкие части хороша, но не реализуйте ее с помощью списка, вместо этого создайте корневой ScrollView с помощью TextView ваших частей. Просто предложение.   -  person Chitrang    schedule 03.11.2014
comment
Кажется, он тратит много времени на getDisplayList(). Из любопытства, что произойдет, если вы отключите аппаратное ускорение?   -  person fadden    schedule 04.11.2014
comment
@Chitrang пробовал это. Один большой TextView в ScollView рендерит около 10 секунд, о чем идет речь. При разделении он добавит все представления и отобразит их все, даже если они не отображаются, поэтому это занимает еще больше времени (отрисовывается весь контейнер в scrollView). Тогда список прокручивается плавно, но при создании занимает около 15 секунд. addView указывает представление рисования, поэтому его нельзя поместить в какой-либо отдельный поток (AsyncTask), он должен вызываться в потоке пользовательского интерфейса.   -  person Andrzej Dąbrowski    schedule 04.11.2014
comment
@fadden getDisplayList иgetView занимают больше всего времени. getDisplayList() создает список отображения для нового TextView (необходим вызов отрисовки), и это нормально, но почему отрисовка текста занимает так много времени? Чистый метод Canvas.drawText ведет себя точно так же. Но я думаю, что вы сделали очень правильное замечание, потому что отключение аппаратного ускорения ничего не изменило.   -  person Andrzej Dąbrowski    schedule 04.11.2014
comment
Мы используем TextView, потому что WebView уже был слишком большой головной болью.   -  person Andrzej Dąbrowski    schedule 04.11.2014
comment
:( Отсутствие хорошего ответа я рассматриваю как очередное свидетельство того, что, к сожалению, Android сильно отстает от iOS с точки зрения UI API.   -  person Andrzej Dąbrowski    schedule 07.11.2014
comment
Я обнаружил, что вызов setText для элемента без фиксированных размеров на удивление дорог: stackoverflow.com/questions/10804436/ Таким образом, я рекомендую убедиться, что все TextViews имеют фиксированные layout_width и layout_height. Это должно хотя бы немного помочь.   -  person VinceFior    schedule 17.03.2016
comment
@ r00dY Нашли ли вы какое-нибудь хорошее решение ..., я плыву в одной лодке :( setText () занимает много времени ..   -  person eRaisedToX    schedule 05.06.2017
comment
@eRaisedToX Нет, но довольно долго не занимался этой проблемой. В моем случае было приложение для чтения, и, честно говоря, если бы я мог вернуться в прошлое, я бы сегодня выбрал WebView.   -  person Andrzej Dąbrowski    schedule 06.06.2017
comment
Ок !! Спасибо за ответ.. :)   -  person eRaisedToX    schedule 06.06.2017
comment
@ r00dY Я думаю, вы занимались наностепенью Android - сейчас я занимаюсь тем же проектом приложения для чтения (сделайте материал для своего приложения) и наткнулся на этот вопрос ...   -  person Ely    schedule 12.07.2018