我使用android中的库连接到终端模拟器,它连接到串行设备(交换机)并显示发送/接收的数据。
当我收到数据时,会自动运行以下方法。当我收到数据时,我想使用onDataReceived
方法中的invalidate更新模拟器屏幕,但是由于某些原因这不起作用,因此我创建了一个处理程序,每1秒执行一次,这样就可以了。
public void onDataReceived(int id, byte[] data)
{
dataReceived = new String(data);
((MyBAIsWrapper) bis).renew(data);
mSession.write(dataReceived);
mSession.notifyUpdate();
viewHandler.post(updateView);
}
现在我想测试收到的某些字符的数据,所以我在onDataReceived
中进行了for循环,再次这不起作用,它只会一次又一次地看到该字符,缺少其中一些字符。所以我将循环添加到处理程序中:
Handler viewHandler = new Handler();
Runnable updateView = new Runnable()
{
@Override
public void run()
{
//update screen ever 1000ms
mEmulatorView.invalidate();
//should check data received every 1000ms
for(int i = 0; i < dataReceived.length(); i++)
{
if(dataReceived.charAt(i) == '>')
{
Log.d(TAG, "found >");
}
if(dataReceived.charAt(i) == '#')
{
Log.d(TAG, "found #");
}
}
viewHandler.postDelayed(updateView, 1000);
}
};
我的问题是,虽然我可以看到屏幕每秒更新一次,但在日志中我可以看到我更频繁地找到字符,它将它们打印到日志100次,为什么会这样? / p>
答案 0 :(得分:1)
我不知道,但原因可能是,因为runnable没有停止。只是提出一个条件,即只有在这个条件成立时才能启动runnbale。因此,如果为false,则runnable会自动停止,例如:
@Override
public void run()
{
//update screen ever 1000ms
mEmulatorView.invalidate();
if(yourCondition==true){ //put here a condition that the runnable only starts if this is true
//should check data received every 1000ms
for(int i = 0; i < dataReceived.length(); i++)
{
if(dataReceived.charAt(i) == '>')
{
Log.d(TAG, "found >");
}
if(dataReceived.charAt(i) == '#')
{
Log.d(TAG, "found #");
}
}
viewHandler.postDelayed(updateView, 1000);
}
}
};