การใช้งาน wait() และ notify() ระหว่างการเชื่อมต่อเซ็นเซอร์หลายตัว

ในแอป Android ของฉัน ฉันต้องการเชื่อมต่อกับเซ็นเซอร์หลายตัวด้วย OnClickListener เพียงปุ่มเดียว อย่างไรก็ตาม จำเป็นต้องใช้เซ็นเซอร์แต่ละตัวในแต่ละครั้งจนกว่าจะมีการเชื่อมต่อก่อนที่จะดำเนินการต่อไป

onSensorConnected จะถูกเรียกเมื่อเซ็นเซอร์เชื่อมต่อสำเร็จ อย่างไรก็ตาม ขณะนี้กำลังพยายามเชื่อมต่อกับเซ็นเซอร์ตัวถัดไปก่อนที่จะเรียก onSensorConnected

ดังนั้นฉันจึงพยายามใช้ wait() เมื่อเซ็นเซอร์กำลังเชื่อมต่อ (onConnectSensors) และ notify() เมื่อสร้างการเชื่อมต่อแล้ว (onSensorConnected) ซึ่งจะช่วยให้เซ็นเซอร์ตัวถัดไปผ่านกระบวนการเดียวกันได้

อย่างไรก็ตาม เซ็นเซอร์ยังคงเชื่อมต่ออยู่ก่อนสัญญาณ notify ใน onSensorConnected ฉันต้องการคำแนะนำในการใช้ wait และ notify

public class myFragment extends Fragment {

    Button connect;
    
    private Boolean sensorConnected = false;
    private final Object lock = new Object();

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        ViewGroup root = (ViewGroup) inflater.inflate(R.layout.myLayout, container,false);

        connect = (Button)root.findViewById(R.id.connectBtn);
        connect.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                onConnectSensors(0); // Connect sensor one at a time..
                onConnectSensors(1);
                onConnectSensors(2);
                onConnectSensors(3);
                onConnectSensors(4);
                onConnectSensors(5);
                onConnectSensors(6);
                onConnectSensors(7);
                onConnectSensors(8);
                onConnectSensors(9);
            }
        });

        return root;
    }

    // Position is the sensor position in a recyclerview
    public void onConnectSensors(int position) {

        BluetoothDevice device = mScanAdapter.getDevice(position);
        mSensorViewModel.connectSensor(getContext(), device);
        // Sensor is now establishing connnection...

        // Wait until recieving sensorConnected = true
        try {
            synchronized (lock) {
                while ( sensorConnected != true ) { // Wait until sensorConnected is true
                    lock.wait();
                }
                sensorConnected = false; // reset status for next sensor
            }
        } catch ( InterruptedException x ) {}
    }

    @Override
    public void onSensorConnected() { // This is called automatically when sensor is finishing connection

        synchronized ( lock ) {
            sensorConnected = true;
            lock.notify();
        }
    }
}

person Frederik Petri    schedule 15.09.2020    source แหล่งที่มา
comment
ฉันไม่เห็นการทำงานพร้อมกันในโค้ดของคุณแค่ wait(), notify() และ synchronized แต่ไม่มีเธรดอื่นใช่ไหม... ดูเหมือนว่าส่วนที่สำคัญที่สุดจะหายไปที่นี่ กรุณาชี้แจงว่า   -  person Lino    schedule 15.09.2020
comment
สิ่งที่ฉันหมายถึงคือฉันไม่เห็นหัวข้ออื่น ๆ เช่น คุณกำลังเรียกใช้เซ็นเซอร์ทั้งหมดตามลำดับในเธรดเดียว และถ้าเซ็นเซอร์ทุกตัวเรียกสิ่งนั้น onSensorConnected หลังจากเสร็จสิ้น ก็ชัดเจนว่าเซ็นเซอร์ตัวอื่นๆ ยังไม่ได้เริ่มต้นใช้งาน (เพราะคุณไม่ได้เรียกใช้เซ็นเซอร์ทั้งหมดพร้อมกัน) ดังนั้นคุณควรลบการเรียก wait() และ notify() เหล่านี้ออกทั้งหมดแล้วโทร onSensorConnected ในเมธอด onClick ของคุณ   -  person Lino    schedule 15.09.2020
comment
ขออภัยหากคำถามและรหัสของฉันไม่ชัดเจนเพียงพอ จริงๆ แล้วฉันต้องเชื่อมต่อกับเซ็นเซอร์แต่ละตัวทีละตัวและรอ onSensorConnected() ระหว่างการเชื่อมต่อแต่ละครั้ง ขณะนี้เซ็นเซอร์ทั้งหมดเชื่อมต่อเร็วเกินไปก่อนที่จะถึง onSensorConnected() สำหรับเซ็นเซอร์แต่ละตัว ฉันจะพยายามชี้แจงคำถามและรหัสขอบคุณ   -  person Frederik Petri    schedule 15.09.2020
comment
ทำไม หาก API อนุญาตให้เชื่อมต่อพร้อมกัน ทำไมคุณจึงต้องแทนที่สิ่งนั้น   -  person user207421    schedule 15.09.2020
comment
ฉันคิดว่ามันโอเวอร์โหลดโปรโตคอลบลูทูธ มีเซ็นเซอร์เพียงไม่กี่ตัวที่เชื่อมต่ออยู่ และบางตัวเพิ่งเริ่มเชื่อมต่อแต่ไม่สามารถเชื่อมต่อได้เต็มที่ อย่างไรก็ตาม เมื่อฉันคลิกเซ็นเซอร์ทีละตัวด้วยตนเองและรอ 'onSensorConnected' มันก็ใช้งานได้ ตอนนี้ฉันแค่อยากทำให้กระบวนการนั้นเป็นแบบอัตโนมัติ   -  person Frederik Petri    schedule 16.09.2020