gpt4 book ai didi

Android postDelayed方法可靠性

转载 作者:太空宇宙 更新时间:2023-11-03 11:11:01 28 4
gpt4 key购买 nike

我正在使用 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 毫秒。

最佳答案

尝试在没有 asynctask 的情况下直接执行它。

我的意思是,如果您在 doInBackground 中所做的只是调用 postDelayed,那么您可以直接在 UI 线程和内部处理程序 runnable 上执行,而不是 publishProgress 直接设置进度。

关于Android postDelayed方法可靠性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25030595/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com