美文网首页
转:解决Matcher ANR

转:解决Matcher ANR

作者: JokAr_ | 来源:发表于2020-03-22 18:18 被阅读0次
    long millis = System.currentTimeMillis();
            // This checkInterval produces a < 500 ms delay. Higher checkInterval will produce higher delays on timeout.
            Matcher matcher = createMatcherWithTimeout(
                    "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "(x+x+)+y", 10000, 30000000);
            try {
                System.out.println(matcher.matches());
            } catch (RuntimeException e) {
                System.out.println("Operation timed out after " + (System.currentTimeMillis() - millis) + " milliseconds");
            }
            System.out.print(foo);
        }
    
        public static Matcher createMatcherWithTimeout(String stringToMatch, String regularExpression, long timeoutMillis,
                                                          int checkInterval) {
            Pattern pattern = Pattern.compile(regularExpression);
            return createMatcherWithTimeout(stringToMatch, pattern, timeoutMillis, checkInterval);
        }
    
    public class TimeoutRegexCharSequence implements CharSequence {
    
        private final CharSequence inner;
    
        private final int timeoutMillis;
    
        private final long timeoutTime;
    
        private final String stringToMatch;
    
        private final String regularExpression;
    
        public TimeoutRegexCharSequence(CharSequence inner, int timeoutMillis, String stringToMatch,
                                        String regularExpression) {
            super();
            this.inner = inner;
            this.timeoutMillis = timeoutMillis;
            this.stringToMatch = stringToMatch;
            this.regularExpression = regularExpression;
            timeoutTime = System.currentTimeMillis() + timeoutMillis;
        }
    
        @Override
        public char charAt(int index) {
            if (System.currentTimeMillis() > timeoutTime) {
                throw new RuntimeException("Timeout occurred after " + timeoutMillis + "ms while processing regular expression '"
                        + regularExpression + "' on input '" + stringToMatch + "'!");
            }
            return inner.charAt(index);
        }
    
        @Override
        public int length() {
            return inner.length();
        }
    
        @Override
        public CharSequence subSequence(int start, int end) {
            return new TimeoutRegexCharSequence(inner.subSequence(start, end), timeoutMillis, stringToMatch, regularExpression);
        }
    
        @Override
        public String toString() {
            return inner.toString();
        }
    }
    
    

    相关文章

      网友评论

          本文标题:转:解决Matcher ANR

          本文链接:https://www.haomeiwen.com/subject/atvtoctx.html