Невозможно синхронизировать потоки в Android Studio - PullRequest
1 голос
/ 18 марта 2020

У меня есть фоновый класс с именем «TCP-клиент», который устанавливает логическое значение true, когда аппаратное обеспечение обнаруживает изменение состояния. И runOnUIThread в основной активности обнаруживает это и обновляет пользовательский интерфейс, являющийся кнопками переключателя, чтобы не вызывать OncheckedChangeListener. Я устанавливаю слушателя в ноль, меняю состояние, затем устанавливаю слушателя в исходное состояние. Но во время выполнения OncheckedChangeListener все еще срабатывает. Я предполагаю, что это проблема синхронизации.

mainActivity. java

public class MainActivity extends AppCompatActivity {
public SwitchButton.OnCheckedChangeListener switchListener;
public com.suke.widget.SwitchButton switch;
public static boolean switchflag=false;
int i;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
    StrictMode.setThreadPolicy(policy);

    setContentView(R.layout.activity_main);

    switch = findViewById(R.id.lightSwitch);
    runThread();

    switchListener = new SwitchButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(SwitchButton view, boolean bChecked) {
                if (bChecked) {
                    Log.d("button", "light is on");
                    connection.tcpClient.sendMessage("li1_1");
                } else {
                    Log.d("Button", "light is off");
                    connection.tcpClient.sendMessage("li1_0");
                }
            }
    };
    switch.setOnCheckedChangeListener(switchListener);
}

    private void runThread() {
    i = 0;
    new Thread() {
        public void run() {
            while (i++ < 1000) {
                try {
                    runOnUiThread(new Runnable() {

                        @Override
                        public void run() {
                            if(connection.tcpClient.getStatusFlag()) {
                                Log.d("main", "got Status");
                                updateUI();
                                connection.tcpClient.setStatusFlag(false);
                            }
                        }
                    });
                    Thread.sleep(300);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }.start();
}

public void updateUI() {
    try {
        switch.setOnCheckedChangeListener(null);
        switch.setChecked(switchFlag);
        switch.setOnCheckedChangeListener(switchListener);
    }catch (NullPointerException e) {e.printStackTrace();}
}

Я не понимаю, где использовать синхронизированный.

1 Ответ

0 голосов
/ 18 марта 2020

Положите

 runThread();

ниже

switch.setOnCheckedChangeListener(switchListener);

Также замените

switch.setChecked(lightFlag);

на

switch.setChecked(switchFlag);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...