1

我正在使用 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);
}

现在我想测试接收到的某些字符的数据,所以我做了一个 for 循环onDataReceived,同样这不起作用,它只会时不时地看到字符,缺少一些字符。所以我将循环添加到处理程序中:

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 次,这是为什么呢?

4

1 回答 1

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);
    }
   }

  };
于 2013-01-11T13:05:09.903 回答