2016-07-13 7 views
0

私は、Bluetoothのシリアルデータをリッスンするスレッドを持っています。Handler.Postdayayedをスレッドで定期的に呼び出す

私は、データをUIスレッドに完全に送信するsendData(byte[] buffer)というUIスレッドにデータを渡す方法があります。これは、高い頻度でパケットを受信すると非常に遅くなる可能性があります。

しかし、私は高い頻度でデータパケットを受信するので、このsendDataメソッドをxミリ秒ごとに呼び出す定期的なハンドラを実装したいと思います。私のスレッドで

私はrun() 方法で次のように呼ばれる:

Looper.prepare; 
mHandler = new Handler(); 

は、私が(自分自身で完璧な仕事をしている)sendData(buffer)をsorrounded:

mHandler.postDelayed(new Runnable() { 
         @Override 
         public void run() { 
          sendData(tmp); 
          System.out.println("PostDelayed| "+ System.currentTimeMillis()); 

          mHandler.postDelayed(this,INTERVAL); 

         } 
        },INTERVAL); 

間隔がAで事前宣言されているのは、メソッドが呼び出される定期的な間隔です。

しかし、postDelayedの実行が呼び出されていません。私はデバッグを試みました、postdelayeds行が呼び出されますが、それは'No such instance field mHandler'で終了します。

何をすべきか?

+0

「mHandler」のようなインスタンスフィールドはありません。 – immibis

+0

それはどういう意味ですか? – VikingPingvin

+0

はじめに、 'mHandler'とは何ですか?宣言はどこですか? – immibis

答えて

1

私は、ScheduledExecutorServiceを使用することをお勧めします。 docsを参照してください。

定期的なアクションをスケジュールするために使用できるscheduleAtFixedRateメソッドがあります。そしてそれを渡す実行可能ファイルで、sendData(tmp)コマンドでmHandler.post()を呼び出します。

+0

私はそれを実装することができましたが、私のインターバル(1000である)とscheduleUnit.Milliseconds(scheduleatfixedrateメソッド)に従ってスケジューリングできません。 – VikingPingvin

+0

代わりに値1LとTimeUnit.SECONDSを使用しようとしましたか? –

+0

はい、成功しませんでしたが、それは常に期間を過ぎて呼び出されます。 – VikingPingvin

関連する問題