-1

Android プロジェクトの目的は、ハードウェア デバイスからデータを読み取り、UI で更新することです。ここで、バックグラウンド スレッドによってデータを受信するコードをカプセル化し、このカプセル化されたクラスからデータを取得するための関数を他のクラスに提供する必要があります。以下は、このカプセル化されたクラスの私のコードです。

public class getDataFromUSB{
        private AtomicInteger usb_data = new AtomicInteger():
        private Random random;

        private Thread thread = new Thread(){
             @override
             public void run(){
                      while(!Thread.currentThread().isInterrupted()){
                          synchronized(usb_data){
                               usb_data.set(read_usb());
                               usb_notify();
                          }
                      }
        };

        public void start(){
             thread.start();
        }

        public int get_data(){
             int ret_data=0;
             synchronized(usb_data){
                     try{
                            usb_data.wait();
                     }catch(InterruptedException e){}
                     ret_data=usb_data.get();
             }
             return ret_data;
        }
        public int read_usb(){
             return random.nextInt();
        }
}

メインのアクティビティ クラスでは、USB のデータをリアルタイムで取得し続け、それを UI のテキストビューに入れたいと考えています。したがって、このクラスを次のように呼び出します。

final getDataFromUSB usb1=new getDataFromUSB();
usb1.start();
for(;;){
         myTextView.setText(String.valueof(usb1.get_data()));
}

ただし、myTextView には何も表示されません。しかし、私がそれをテストすると

for(;;){
         Log.d(TAG,"data="+usb1.get_data());
}

ログで常にリアルタイムの値を取得できます。誰でもこの問題について助けることができますか? または、この種の機能をカプセル化し、リアルタイム データを提供できる get_data() のような単純な関数を提供するより良いアイデアがある場合は、お知らせください。

4

2 に答える 2

1

を使用for(;;)すると、無限ループが作成され、一時停止することはなく、可能な限り高速に実行されます。

したがって、他のスレッドは、実際に独自の処理の一部を実行するための (多くの) タイム スケジュールを取得しません。UI スレッド ( を再描画するTextView) の優先度は低いため、 が再描画されることはありませんTextView..!

これについてもう少し考えてみてください。人間の目は、毎秒 30 フレームのリフレッシュ レートを持っています。お使いのデバイスには最大リフレッシュ レートもあり、TextView. そのため、UI を 60 fps で更新するのが一般的です。できるだけ早く UI を更新する必要はありません。(これは、バッテリーの使用量にも優れています!)

そのため、何らかのタイミング ソリューションを使用して、リフレッシュ速度を 60 fps に下げる必要があります。

getDataFromUSBこれは、スレッドの無制限のリフレッシュ レートにも当てはまります。あなたが使用するよりも速い速度でUSBをつかむことは意味がありません...

于 2013-01-22T16:23:29.830 に答える
0

AndroidのUIスレッドについて何か読んだことがありますか?

ループを実行しているUIスレッドをブロックしています。すべてのUI描画はUIスレッドで行われます。setTextはプロパティを設定するだけです。ビューは更新されません。行ったようにUIスレッドをブロックしないでください。たとえば、ハンドラーを使用します。

于 2013-01-22T16:22:11.283 に答える