4

android.os.Handler の「postDelayed」メソッドを使用して、リレーのオンとオフを切り替えています。2 つのランナブルがあります - 1 つは ON コマンドを送信するためのもので、もう 1 つは OFF コマンドを送信するためのものです。リレーは一定のミリ秒の間オンに保ち、一定のミリ秒の間オフにする必要があります。

この古い Android の投稿 http://android-developers.blogspot.in/2007/11/stitch-in-time.html を参照して、繰り返しコマンドをリレーに送信しました

開始コマンドは、異なるリレーに接続された異なるデバイスから同時に送信する必要があります。そのため、すべてのリレーが同時にオンになるはずです。

すべてのデバイスで GPS 時刻同期を使用して、コマンドが各デバイスから同時に送信されるようにします。すべてのデバイスの GPS 時刻が同期されたら、最初に 2 番目の開始時に 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 に答える