Нужна помощь для оптимизации следующего кода Java. Это код для настройки цвета определенных ключевых слов в текстовом представлении.(Приложение для Android)
Я разрабатываю приложение для просмотра C-программ. Я хотел дать простую цветовую схему тексту, который хранится в базе данных, извлекается в виде строки и затем передается в текстовое представление.
Код, который я написал, назначает зеленый цвет объявлениям и заголовкам файла заголовка, синий цвет - номерам, printf, scanf... красный - типам данных, таким как int, char, float.
Это, однако, очень неэффективно. До применения этой цветовой схемы мое приложение мгновенно отображало активность просмотра текста. Теперь, в зависимости от продолжительности программ, это может занять от 4 до 5 секунд, что является действительно низкой производительностью.
то, что он делает, это берет одно ключевое слово за раз, затем выполняет итерацию полного текста textview, ища только это конкретное ключевое слово, и изменяет его цвет, устанавливает текст снова. Таким образом, он пересекает текст всего текстового просмотра 29 раз, поскольку я определил 29 ключевых слов в массивах строк (а именно: ключевые слова - зеленый, ключевые слова - синий, ключевые слова - красный).
Функция onCreate действия содержит следующий код:
textView = (TextView) findViewById(R.id.textView1);
textView.setText(programtext);
textView.setBackgroundColor(0xFFE6E6E6);
//The problem stars here
String [] keywordsgreen={"#define","#include","stdio.h","conio.h","stdlib.h","math.h","graphics.h","string.h","malloc.h","time.h","{","}","(",")","<",">","&","while ","for "};
for(String y:keywordsgreen)
{
fontcolor(y,0xff21610B);
}
String [] keywordsred={"%d","%f","%c","%s","int ","char ","float","typedef","struct ","void "};
for(String y:keywordsred)
{
fontcolor(y,0xFFB40404);
}
String [] keywordsblue={"printf","scanf","\n","getch","0","1","2","3","4","5","6","7","8","9"};
for(String y:keywordsblue)
{
fontcolor(y,0xFF00056f);
}
Функция fontcolor выглядит следующим образом:
private void fontcolor(String text,int color)
{
Spannable raw=new SpannableString(textView.getText());
int index=TextUtils.indexOf(raw, text);
while (index >= 0)
{
raw.setSpan(new ForegroundColorSpan(color), index, index + text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
index=TextUtils.indexOf(raw, text, index + text.length());
}
textView.setText(raw);
}