@Override
public void run() {
try {
exec = Runtime.getRuntime().exec("getevent | grep event1");
InputStreamReader is = new InputStreamReader(
exec.getInputStream());
String s;
BufferedReader br = new BufferedReader(is);
Log.i("br.readLine", " = " + br.readLine());
while ((s = br.readLine()) != null) {
Log.i("s2", " " + s);
}
// is.close();
// exec.destroy();
} catch (IOException e) {
Log.e("thread ioexception", " " + e.getCause());
e.printStackTrace();
}
}
我尝试将命令的结果记录到线程中的getevent。
但是将命令的结果放在缓冲区中,缓冲区为空(null)。
也许只要执行此命令,似乎结束时没有收到任何输入。
在维护线程的同时,我想继续运行getevent命令。
如何做到这一点?任何想法?
修改 getErrorStream()
getevent [-t] [-n] [-s switchmask] [-S] [-v [mask]] [-d] [-p] [-i] [-l] [-q] [-c count] [-r] [device]
-t: show time stamps
-n: don't print newlines
-s: print switch states for given bits
-S: print all switch states
-v: verbosity mask (errs=1, dev=2, name=4, info=8, vers=16, pos. events=32, props=64)
-d: show HID descriptor, if available
-p: show possible events (errs, dev, name, pos. events)
-i: show all device info and possible events
-l: label event types and names in plain text
-q: quiet (clear verbosity mask)
-c: print given number of events then exit
-r: print rate events are received
GetErrorStream是手动getevent的结果。
如果指令要正常运行,它就不会有任何记录(其他正常命令实际上都是。例如)ls)
我认为getevent命令似乎导致了 CALLBACK 方法以来的各种问题。
答案 0 :(得分:1)
编辑:我想现在我遇到了你的问题。管道行为不是跨平台的,因为它是已执行shell的功能。这就是为什么它在java中没有像你期望的那样工作。尝试使用如下的脚本生成一个新的shell,它实现了你期望的管道功能。
String[] cmd = {
"/system/bin/sh",
"-c",
"getevent | grep event1"
};
我将保留其余的答案,因为它可以帮助某人。
我认为您在没有正确权限的情况下执行getevent | grep event1
。至少您需要是root
用户或input
组。
修改:我仍然认为您没有正确的权限。当然,对于运行getevent
,不需要特殊权限,因为它可以由每个人执行。但请记住,getevent
读取/dev/input/*
,其具有以下权限:
crw-rw---- root input 13, 64 2016-01-24 21:34 event1
尽量确保您的应用程序真正允许阅读event1
。
您还应该尝试使用getErrorStream()
代替getInputStream()
来查看出现了什么问题。
关于你问题的第二部分,我不确定我是否理解正确。你想在同一个线程中定期执行命令吗? (我没有,请看下面的编辑。)
然后,您只需在while(1)
循环中运行代码,并根据需要进行休眠。更高级的是使用Timer和TimerTask。
如果您想控制线程外部的每个循环,只需使用Object.wait()
和Object.notify()
即可。另一种更高级的可能性是使用Thread pools。有趣的一个可能是SingleThreadExecutor。
编辑:正如我想的那样,我没有理解你。但是,我会保留我的答案的第二部分,也许它可以帮助别人。
对于您的用例,您的代码应该可以正常工作。我认为它确实会立即返回,因为发生了错误。如上所述,尝试使用getErrorStream()
来查看实际发生的情况。