From 91d5eab872dbe2947c6dc0d2e4c6381794ceb38d Mon Sep 17 00:00:00 2001 From: hyb1996 <946994919@qq.com> Date: Sat, 15 Sep 2018 22:00:42 +0800 Subject: [PATCH] fix(ui): CodeEditText rendering --- .../autojs/ui/edit/editor/CodeEditText.java | 21 +++++++++------- .../ui/edit/editor/JavaScriptHighlighter.java | 25 +++++++++++-------- .../com/stardust/autojs/core/util/Shell.java | 2 +- 3 files changed, 27 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/org/autojs/autojs/ui/edit/editor/CodeEditText.java b/app/src/main/java/org/autojs/autojs/ui/edit/editor/CodeEditText.java index 8dfc8dc1..55ad7c49 100644 --- a/app/src/main/java/org/autojs/autojs/ui/edit/editor/CodeEditText.java +++ b/app/src/main/java/org/autojs/autojs/ui/edit/editor/CodeEditText.java @@ -60,7 +60,7 @@ public class CodeEditText extends AppCompatEditText { protected HVScrollView mParentScrollView; private final CopyOnWriteArrayList mCursorChangeCallbacks = new CopyOnWriteArrayList<>(); - private JavaScriptHighlighter.HighlightTokens mHighlightTokens; + private volatile JavaScriptHighlighter.HighlightTokens mHighlightTokens; private Theme mTheme; private TimingLogger mLogger = new TimingLogger(LOG_TAG, "draw"); private Paint mLineHighlightPaint = new Paint(); @@ -192,10 +192,11 @@ public class CodeEditText extends AppCompatEditText { return; } JavaScriptHighlighter.HighlightTokens highlightTokens = mHighlightTokens; + Log.d(LOG_TAG, "drawText: tokens = " + highlightTokens); Layout layout = getLayout(); int lineCount = getLineCount(); int textLength = highlightTokens == null ? 0 : highlightTokens.getText().length(); - String text = highlightTokens == null ? "" : highlightTokens.getText(); + Editable text = getText(); int paddingLeft = getPaddingLeft(); int scrollX = Math.max(getRealScrollX() - paddingLeft, 0); Paint paint = getPaint(); @@ -260,10 +261,10 @@ public class CodeEditText extends AppCompatEditText { } paint.setColor(previousColor); float offsetX = paint.measureText(text, lineStart, previousColorPos); - if(previousColorPos < 0 || visibleCharEnd > textLength || previousColorPos >= visibleCharEnd){ + if (previousColorPos < 0 || visibleCharEnd > textLength || previousColorPos >= visibleCharEnd) { Log.e(LOG_TAG, "IndexOutOfBounds: previousColorPos = " + previousColorPos + ", visibleCharEnd = " - +visibleCharEnd + ", textLength = " + textLength); - postInvalidate(); + + visibleCharEnd + ", textLength = " + textLength); + //postInvalidate(); return; } canvas.drawText(text, previousColorPos, visibleCharEnd, paddingLeft + offsetX, lineBaseline, paint); @@ -413,10 +414,12 @@ public class CodeEditText extends AppCompatEditText { public void updateHighlightTokens(JavaScriptHighlighter.HighlightTokens highlightTokens) { - post(() -> { - mHighlightTokens = highlightTokens; - invalidate(); - }); + if (mHighlightTokens != null && mHighlightTokens.getId() >= highlightTokens.getId()) { + return; + } + mHighlightTokens = highlightTokens; + Log.d(LOG_TAG, "updateHighlightTokens: tokens = " + highlightTokens); + postInvalidate(); } @Override diff --git a/app/src/main/java/org/autojs/autojs/ui/edit/editor/JavaScriptHighlighter.java b/app/src/main/java/org/autojs/autojs/ui/edit/editor/JavaScriptHighlighter.java index 9ecfb251..20752a55 100644 --- a/app/src/main/java/org/autojs/autojs/ui/edit/editor/JavaScriptHighlighter.java +++ b/app/src/main/java/org/autojs/autojs/ui/edit/editor/JavaScriptHighlighter.java @@ -12,9 +12,9 @@ import org.autojs.autojs.ui.widget.SimpleTextWatcher; import org.mozilla.javascript.Token; import java.io.IOException; -import java.util.Arrays; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; public class JavaScriptHighlighter implements SimpleTextWatcher.AfterTextChangedListener { @@ -25,12 +25,17 @@ public class JavaScriptHighlighter implements SimpleTextWatcher.AfterTextChanged public final int[] colors; private String mText; private int mCount; + private final int mId; - public HighlightTokens(String text) { + public HighlightTokens(String text, int id) { colors = new int[text.length()]; mText = text; + mId = id; } + public int getId() { + return mId; + } public void addToken(int tokenStart, int tokenEnd, int color) { for (int i = tokenStart; i < tokenEnd; i++) { @@ -41,9 +46,7 @@ public class JavaScriptHighlighter implements SimpleTextWatcher.AfterTextChanged @Override public String toString() { - return "HighlightTokens{" + - "colors=" + Arrays.toString(colors) + - '}'; + return super.toString() + "{count = " + mCount + ", length = " + mText.length() + "}"; } public int getCharCount() { @@ -57,11 +60,13 @@ public class JavaScriptHighlighter implements SimpleTextWatcher.AfterTextChanged private Theme mTheme; private CodeEditText mCodeEditText; - private ExecutorService mExecutorService = Executors.newSingleThreadExecutor(); + private ThreadPoolExecutor mExecutorService = new ThreadPoolExecutor(3, 6, + 2L, TimeUnit.MINUTES, new LinkedBlockingQueue<>()); private AtomicInteger mRunningHighlighterId = new AtomicInteger(); private TimingLogger mLogger = new TimingLogger(CodeEditText.LOG_TAG, "highlight"); public JavaScriptHighlighter(Theme theme, CodeEditText codeEditText) { + mExecutorService.allowCoreThreadTimeOut(true); mTheme = theme; mCodeEditText = codeEditText; codeEditText.addTextChangedListener(new SimpleTextWatcher(this)); @@ -94,12 +99,10 @@ public class JavaScriptHighlighter implements SimpleTextWatcher.AfterTextChanged private void updateTokens(String sourceString, int id) throws IOException { TokenStream ts = new TokenStream(null, sourceString, 0); - HighlightTokens highlightTokens = new HighlightTokens(sourceString); + HighlightTokens highlightTokens = new HighlightTokens(sourceString, id); int token; int color = mTheme.getColorForToken(Token.NAME); while ((token = ts.getToken()) != Token.EOF) { - if (mRunningHighlighterId.get() != id) - return; color = mTheme.getColorForToken(token); highlightTokens.addToken(ts.getTokenBeg(), ts.getTokenEnd(), color); } diff --git a/autojs/src/main/java/com/stardust/autojs/core/util/Shell.java b/autojs/src/main/java/com/stardust/autojs/core/util/Shell.java index 406bf33f..7df46d77 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/util/Shell.java +++ b/autojs/src/main/java/com/stardust/autojs/core/util/Shell.java @@ -62,7 +62,7 @@ public class Shell extends AbstractShell { } } - private static final boolean DEBUG = true; + private static final boolean DEBUG = false; private static final String TAG = "Shell"; private volatile TermSession mTermSession;