Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Подсветка кода на android. Мой навык

Anna | 3.06.2014 | нет комментариев
Во время разработки моего последнего приложения мне пришлось провести достаточно много времени, экспериментируя с различными подходами к размещениюspan’ов в EditText. В этом посте хотелось бы подвести определенный вывод этого времяпрепровождения, а также сэкономить время тем, кто в грядущем будет решать сходственные задачи.

Кода будет немножко, только основные моменты.

Для начала хочу привести маленький список фактов для того, Дабы ввести читателя в курс дела:

  • Невзирая на N ядер (всякое с большой частотой), теперешний телефоны все еще дюже крепко уступают в продуктивности даже недорогим, но огромным компьютерам.
  • Всякое приложении в андроиде имеет сурово ограниченный размер выделяемой памяти. И он не огромен.
  • Способ setSpan работает медлительно.
  • Чем огромнее работы вы перенесете в Worker’ы, тем отзывчивее будет ваше приложение.
  • Удерживать подсвеченным каждый текст не получится — только видимую его часть.
  • Достаточно видимо, но все же: поиск места размещения спана в UI потоке делать не получится.

Выходит, сразу к моему решению, которое, допустимо, вдалеке не самое оптимальное. В этом случае буду рад советам.

Всеобщие изложение конструкции предлагаемого решения


Создаем растяжение ScrollView и в него помещаем EditText. У ScrollView переопределяем onScrollChanged для того, Дабы отлавливать момент окончания скроллинга. В это время уведомляем наш непрерывно висящий в фоне поток о том, что текст нужно распарсить.
EditText’у вешаем слушателя метаморфозы текста — TextWatcher’а . В его способе afterTextChanged сообщаем Worker’а о том, что нужно распарсить текст. В классе (потомке EditText) заводим Handler, в тот, что из Worker’а будем отсылать список спанов, которые нужно навесить на текст.

Всеобщая схема такова. Сейчас к деталями, которые выскажу в форме вопрос-результат.

Как отловить момент окончания сроллинга?

Способ onScrollChanged вызывается позже всякого «проскролленого» пикселя, и если принуждать поток-парсер трудиться позже всякого вызова, то, внятное дело, ничего отменного из этого не выйдет. Следственно делаем дальнейшим образом:

private Thread timerThread;
protected void onScrollChanged(int x, int y, int oldx, int oldy) {
    super.onScrollChanged(x, y, oldx, oldy);

    timer = 500;

    if (timerThread == null || !timerThread.isAlive()) {
        timerThread = new Thread(lastScrollTime);
        timerThread.start();
    }
}

Runnable lastScrollTime = new Runnable() {
    @Override
    public void run() {
        while (timer != 0) {
            timer -= 10;
            try {
                Thread.sleep(10);
                } catch (InterruptedException e) {
            }
        }

        CustomScrollView.this.post(new Runnable() {
            @Override
            public void run() {
                if (onScrollStoppedListener != null) {
                    onScrollStoppedListener.onScrollStopped(CustomScrollView.this.getScrollY());
                }
            }
        });
    }
};

public interface OnScrollStoppedListener {
    void onScrollStopped(int scrollY);
}

То есть всякий раз при вызове способа выставляем таймер в 500 мс и, если в течении этого времени способ не вызывается, то уведомляем OnScrollStoppedListener о том, что скроллинг остановился. В моем случае интерфейс OnScrollStoppedListener реализует мой EditText.

Как не стартовать поток-парсер позже всякого введенного символа?

См. предшествующий пункт.
На самом деле данный метод в данном случае вдалеке не совершенен потому, что пользователю неизменно придется ожидать N-ое число

Источник: programmingmaster.ru
Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB