Android调用包含线程的封装类,无限循环用于刷新UI不工作

Android调用包含线程的封装类,无限循环用于刷新UI不工作,android,multithreading,encapsulation,Android,Multithreading,Encapsulation,android项目的目的是从硬件设备读取一些数据,然后在UI中更新它们。现在我们需要封装一些通过后台线程接收数据的代码,并为其他类提供一个函数来从这个封装的类获取数据。下面是这个封装类的代码: public class getDataFromUSB{ private AtomicInteger usb_data = new AtomicInteger(): private Random random; private Thread thread

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()可以提供实时数据,请告诉我

你读过android中的UI线程吗

您正在阻止运行循环的UI线程。所有UI绘图都发生在UI线程中。setText只设置属性。它不会更新视图。永远不要像以前那样阻塞UI线程。例如,使用Handler。

当您为(;;)使用
时,您将创建一个无限循环,该循环从不暂停并尽可能快地运行

因此,其他线程没有(很多)时间安排来实际执行它们自己的一些处理。UI线程(将重新绘制
TextView
)的优先级较低,因此无法重新绘制
TextView

你可能想再考虑一下:人眼的刷新率是每秒30帧。您的设备还有一个最大刷新率,它比您更新
TextView
的速率慢得多。因此,以60 fps的速度更新UI是很常见的。当然,没有必要尽可能快地刷新UI。(这对您的电池使用也有好处!)

因此,您需要使用某种定时解决方案将刷新速度降低到60 fps


这也适用于
getDataFromUSB
线程的无限刷新率!以比您(将要)使用的更快的速度获取USB没有任何意义…

我也想使用handler,但我们项目的要求是将所有多线程代码放入封装的类中,并提供简单的函数,如get_Data(),供用户调用并获取实时数据。因此,在封装的类中使用处理程序,在主活动类中不使用任何处理程序代码,我找不到这样做的方法。例如,从AsyncTask调用get_数据函数。并将数据发布到UI thead以更新视图。我也考虑过这一点,但我们仍然不能让AsyncTask出现在用户的主活动类中。如果我在类中封装AsyncTask以调用get_数据,我如何让用户使用他们的类中的OnProgressUpdatea()在UI上操作?