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);

次に、 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() を呼び出すたびに、最新の値が得られるはずです。そうじゃない?

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 に答える