我正在使用 android.os.Handler 的“postDelayed”方法来打开和关闭继电器。有 2 个可运行 - 一个用于发送 ON 命令,另一个用于发送 OFF 命令。继电器需要保持打开固定 ms 并再次关闭固定 ms。
我参考了这篇旧的 android 帖子 http://android-developers.blogspot.in/2007/11/stitch-in-time.html 向中继发送重复命令
启动命令需要从不同的设备同时发送——每个设备都连接到不同的继电器。所以效果应该是所有继电器都应该同时打开。
我确保从每个设备同时发送命令,在所有设备上使用 GPS 时间同步。一旦所有设备都同步了 GPS 时间,我第一次在秒开始时发送 ON 命令,然后将固定延迟添加到两个可运行的 postDelay 方法中。
我仍然注意到继电器本身第一次没有同时打开。我注意到延迟长达 1 秒。
我需要知道“postDelayed”方法的可靠性如何?我可以相信它的精度高达 5 毫秒吗?有没有更可靠的方法以固定延迟发送重复命令?
这是部分代码
public class RelayAsyncTask extends AsyncTask<Void, Integer, Boolean>
{
private Activity context = null;
private Handler handler = null;
private Runnable offRunnable,onRunnable;
@Override
protected void onPreExecute()
{
handler = new Handler();
onRunnable = new Runnable() {
@Override
public void run() {
new RelayTurnOnAsyncTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, null);
publishProgress(1); // used to display on UI that a command has been sent
handler.postDelayed(offRunnable, 500);
}
};
offRunnable = new Runnable() {
@Override
public void run() {
new RelayTurnOffAsyncTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, null);
publishProgress(2); // used to display on UI that a command has been sent
handler.postDelayed(onRunnable, 1000);
}
};
super.onPreExecute();
}
@Override
protected Boolean doInBackground(Void... params) {
try {
// Code to calculate diff when first ON command should be sent
.
.
handler.postDelayed(onRunnable, diff);
}
catch(Exception e)
{
e.printStackTrace();
}
return null;
}
@Override
protected void onProgressUpdate(Integer... values) {
switch (values[0]) {
case 0:
{
break;
}
case 1:
{ //code to update UI
.
.
break;
}
case 2:
{ //code to update UI
. .
.
break;
}
default:
break;
}
}
@Override
protected void onPostExecute(Boolean result) {
super.onPostExecute(result);
}
}
当调用 RelayTurnOnAsyncTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, null) 时,我还注意到最多 10 毫秒的延迟。