0

我对 Android 和 Java 很陌生。基本上,我想实现一个Android后台线程的封装,在这个后台线程中,我有一个无限循环,它会定期执行一些获取数据的操作(比如从互联网,或者从一些硬件设备)。

封装的类必须只提供类似getData()其他人获取数据的功能。但是每次当我getData()从其他类调用这个函数时,它永远不会给我变化的值,而只会给我初始化的值。我研究了AsyncTask,HandlerMessage实现多线程的方法。他们都给了我初始化的值。

下面是 Handler 和 Message 的封装类:

public class getDataFromUSB{

private int usb_data;

private Handler handler = new Handler(){
    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        if(msg.what==1){

            usb_data=msg.arg1;


        }
    }
};

private Thread thread = new Thread(){
    @Override
    public void run(){
        while(!Thread.currentThread().isInterrupted())
        {
                            int a=read_usb();
            Message msg = new Message();
            msg.arg1 = a;
            msg.what = 1;
            handler.sendMessage(msg);
            try {
                Thread.sleep(15);
            } catch (InterruptedException e) {
                System.err.println("");
                this.interrupt();
            }
        }
    }
};
public void start(){
    thread.start();

}
public int get_data(){
    return usb_data;
}
public int read_usb()
{ 
    int a=10;
    return a;
}

}

然后在另一个类中,这里是调用代码getDataFromUSB

getDataFromUSB usb1= new getDataFromUSB();
usb1.start();
int a=usb1.getData();
Log.e(TAG,"a = " +a);

然后每次我调用这个usb1.getData(),值总是0。我不明白为什么。

现在我继续做一些更现实的事情。我在我的 getDataFrom USB 类中添加了一个随机对象以提供不同的数字,我还更改了为 usb_data 分配值的方式,我认为最好只在后台线程中进行,无需将其移动到句柄消息中. 所以它变成:

public class getDataFromUSB{

private int usb_data;
    private Random random = new Random(555L);

private Handler handler = new Handler(){
    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);

    }
};

private Thread thread = new Thread(){
    @Override
    public void run(){
        while(!Thread.currentThread().isInterrupted())
        {
            int a=read_usb();
            usb_data=a;
            Message msg = new Message();
            handler.sendMessage(msg);
        }
    }
};
public void start(){
    thread.start();

}
public int get_data(){
    return usb_data;
}
public int read_usb()
{ 
    return random.nextInt();
}

}

然后我像 Nikita 建议的那样从另一个班级调用它:

    Handler h = new Handler();   
    for (int i=0;i<20;i++){
    h.postDelayed(new Runnable() {
        public void run() {
            int data=usb1.get_data();
            Log.e(TAG,"data= " +data);  
            }
        },500); 
    }

奇怪的是,它有时会给出所有相同的数字,有时会给出几个数字,有时会给出不同的数字。据我了解,usb_data 一直在后台线程内更改,因此我们没有义务等待 handlemessage 继续进行。每次我调用 getData() 时,它都应该给我最新的值。不是吗?

4

1 回答 1

0

问题可能如下:您从主 UI 线程运行代码。当您新启动线程时 - 它向处理程序发送消息。此消息被添加到主线程的队列中,当它完成当前工作时将在主线程中处理。当前主线程运行您的代码,并且在您调用之前不可能处理该消息usb.getData()。要检查您的更新线程是否正常工作,您可以发布延迟的可运行,它将打印值usb1.getData()

final getDataFromUSB usb1= new getDataFromUSB();
usb1.start();
Handler h = new Handler();
h.postDelayed(new Runnable() {
    public void run() {
        int a=usb1.getData();
        Log.e(TAG,"a = " +a);
    }
}, 500); // Waits 500 milliseconds and runs runnable on current thread.
于 2013-01-15T16:22:32.430 回答