我正在尝试使用top命令收集 Android 应用程序的 CPU 负载信息。虽然下面的代码提供了预期的输出,但顶部间隔应以(默认)3 秒的间隔更新其读数。然而,从 BufferedReader 读取时,每 3 秒会记录相同的输出。如果我将进程的运行时间包含在顶部的输出中,它也不会改变。所以看起来我只是一遍又一遍地获得每个间隔第一次运行的输出。
更新:看来上述问题只能在模拟器上重现。在物理设备上,顶部更新的 CPU 读数会在每个时间间隔内正确更新。
我尝试的另一件事是让 top 仅运行一次并收集该输出。虽然这有效,但启动 top 命令的开销看起来会扭曲读数。
我也很惊讶我没有找到现成的代码。既然对 /proc 目录的访问已受到限制,是否有更好的方法来检查应用程序的 CPU 负载?ps命令还提供 cpu 负载,但这提供了进程整个生命周期内运行所用时间的百分比,这是一个不太有用的值。
private void startCollecting() {
Thread thread = new Thread() {
@Override
public void run() {
try {
ProcessBuilder builder = new ProcessBuilder("top", "-q", "-oCMDLINE,%CPU", "-s2", "-b");
Process process = builder.start();
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
Log.d(TAG, line);
processStatsLine(line);
}
reader.close(); …Run Code Online (Sandbox Code Playgroud) 在 react-native-web 中创建自定义组件时,我想访问我的 View 组件的底层 DOM 节点以添加/删除 eventListener。
class MyButton extends React.Component {
render() {
return (
<View ref={component => this._root = component}>
<Text>{this.props.label}</Text>
</View>
)
}
}
Run Code Online (Sandbox Code Playgroud)
我想像这样添加一个事件监听器:
this._root.dontknowthis.addEventListener('sn:focused', this._componentFocused);
Run Code Online (Sandbox Code Playgroud)
作为替代解决方案,我尝试直接渲染一个组件,然后附加 eventListener:
<div
ref={e => (this.el = e)}
tabIndex="-1"
>
<WrappedComponent {...this.props} />
</div>
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我可以附加一个 eventListener:
this.el.addEventListener('sn:focused', this._componentFocused);
Run Code Online (Sandbox Code Playgroud)
这有效,但我也想在这个组件上设置一个样式,最好是通过 props 传递的样式。这似乎不起作用,因为 react-native 样式与 DOM 节点样式不同。
那么这里最好的解决方案是什么?继续使用 div 组件并以某种方式重新格式化样式,还是使用 View 并以某种方式访问底层 DOM 节点以附加侦听器?