我对 Android 和 Java 很陌生。基本上,我想实现一个Android后台线程的封装,在这个后台线程中,我有一个无限循环,它会定期执行一些获取数据的操作(比如从互联网,或者从一些硬件设备)。
封装的类必须只提供类似getData()
其他人获取数据的功能。但是每次当我getData()
从其他类调用这个函数时,它永远不会给我变化的值,而只会给我初始化的值。我研究了AsyncTask
,Handler
和Message
实现多线程的方法。他们都给了我初始化的值。
下面是 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() 时,它都应该给我最新的值。不是吗?