Реализация функций wait() и notify() между несколькими подключениями датчиков

#java #while-loop #wait #notify

#java #цикл while #подождите #уведомлять

Вопрос:

В моем приложении для Android я хотел бы подключиться к нескольким датчикам с помощью одной кнопки OnClickListener. Тем не менее, он должен принимать каждый датчик за раз, пока не будет установлено соединение, прежде чем переходить к следующему.

onSensorConnected вызывается, когда датчик успешно подключен. Однако прямо сейчас он пытается подключиться к следующему датчику перед onSensorConnected вызовом.

Поэтому я попытался реализовать a wait() при подключении датчика ( onConnectSensors ) и a 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();
        }
    }
}
  

Комментарии:

1. Я не вижу никакого параллелизма в вашем коде, только некоторые wait() , notify() и synchronized , но никаких других потоков?… Кажется, что здесь отсутствует самая важная часть. Пожалуйста, уточните, что

2. Я имел в виду, что я не вижу никаких других потоков, например, вы вызываете все датчики последовательно в одном потоке. И если каждый из датчиков вызывает это onSensorConnected после завершения, то становится ясно, что другие датчики не были инициализированы (потому что вы не вызываете их все сразу). Поэтому вам следует просто полностью удалить эти вызовы wait() и notify() и вызвать onSensorConnected в вашем onClick методе

3. Извините, если мой вопрос и код недостаточно понятны. На самом деле мне нужно подключаться к каждому датчику по одному за раз и ждать onSensorConnected() между каждым подключением. Прямо сейчас все датчики подключаются слишком быстро, прежде чем для каждого датчика будет достигнута функция onSensorConnected(). Я постараюсь прояснить вопрос и код, спасибо.

4. Почему? Если API позволяет одновременным подключениям, почему вы хотите переопределить это?

5. Я думаю, что это перегружает протокол Bluetooth. Подключено только несколько датчиков, а некоторые только начинают подключаться, но никогда не подключаются полностью. Однако, когда я вручную «щелкаю» по одному датчику за раз и жду «onSensorConnected», это работает. Теперь я просто хочу автоматизировать этот процесс