Files
2020-08-27 12:38:23 +08:00

86 lines
2.6 KiB
Java

package com.proxgrind.chameleon.utils.stream;
import java.util.Queue;
import java.util.concurrent.LinkedBlockingQueue;
public class LineParseUtils extends Thread {
private String LOG_TAG = this.getClass().getSimpleName();
/*
* 回调接口,当有完整的一行出现时回调!
* */
public interface OnNewLineLisenter {
void onNewLine(String str);
}
//队列,生产消费!
private Queue<Character> mConsoleQueue = new LinkedBlockingQueue<>();
//回调接口!
private OnNewLineLisenter mLisenter;
//标志,是否暂停!
private volatile boolean mPauseLabel = false;
//标志,是否结束!
private volatile boolean mCancelLabel = false;
public LineParseUtils(OnNewLineLisenter lisenter) {
mLisenter = lisenter;
}
@Override
public void run() {
//迭代队列
StringBuilder sb = new StringBuilder(256);
while (!mCancelLabel) {
if (mPauseLabel) {
//Log.d(LOG_TAG, "DynamicLineParseThread is pause!");
continue;
}
if (mConsoleQueue.size() == 0) continue;
if (mLisenter != null) {
Character c;
while ((c = mConsoleQueue.poll()) != null) {
//遇到的是换行符,则需要处理换行符!
if (c == '\n') {
//回调之前的结果!
String s = sb.toString();
//Log.d("****", "DLPU新行: " + s);
//开始回调!
mLisenter.onNewLine(s);
//清除缓存,重新建立对象!
sb = new StringBuilder(256);
//尝试通知GC
System.gc();
//直接跳过下一步的换行符添加!
break;
}
//否则一直追加进缓冲区
sb.append((char) c);
//Log.d("****", "DLPU: " + sb.toString());
}
}
}
}
@Override
public synchronized void start() {
//处理启动相关的实现!
mPauseLabel = false;
if (!isAlive()) {
super.start();
}
}
public synchronized void appendText(Character txt) {
mConsoleQueue.add(txt);
}
public synchronized void pause() {
mPauseLabel = true;
}
public synchronized void cancel() {
mCancelLabel = true;
}
}