4

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

4

1 回答 1

0

尝试不使用 asynctask 直接执行此操作。

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

于 2014-07-30T08:27:37.290 回答