私は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);
次に、 this を呼び出すたびusb1.getData()
に、値は常に 0 になります。理由がわかりません。
今、私はいくつかのより現実的なことを進めています。getDataFrom USB クラスにランダム オブジェクトを追加して、さまざまな数値を提供します。また、usb_data に値を割り当てる方法も変更します。バックグラウンド スレッドでのみ行う方がよいと思います。handlemessage に移動する必要はありません。 . したがって、次のようになります。
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();
}
}
次に、ニキータが提案したような別のクラスから呼び出します。
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() を呼び出すたびに、最新の値が得られるはずです。そうじゃない?