无法在Android Studio中同步线程

无法在Android Studio中同步线程,android,thread-safety,synchronized,Android,Thread Safety,Synchronized,我有一个名为“TCP客户端”的后台类,每当在硬件中检测到状态更改时,它都会将布尔值设置为true。主活动中的runOnUIThread检测到这一点,并更新作为开关按钮的UI,为了不触发OncheckedChangeListener,我将侦听器设置为null,更改状态,然后将侦听器设置为其原始状态。但在运行时OncheckedChangeListener仍在触发。我想这是一个同步问题 mainActivity.java public class MainActivity extends AppCo

我有一个名为“TCP客户端”的后台类,每当在硬件中检测到状态更改时,它都会将布尔值设置为true。主活动中的runOnUIThread检测到这一点,并更新作为开关按钮的UI,为了不触发OncheckedChangeListener,我将侦听器设置为null,更改状态,然后将侦听器设置为其原始状态。但在运行时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();}
}
public类MainActivity扩展了AppCompatActivity{
公共SwitchButton.OnCheckedChangeListener switchListener;
public com.suke.widget.SwitchButton开关;
公共静态布尔开关标志=false;
int i;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
StrictMode.ThreadPolicy policy=新建StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(策略);
setContentView(R.layout.activity_main);
开关=findViewById(R.id.lightSwitch);
runThread();
switchListener=新建SwitchButton.OnCheckedChangeListener(){
@凌驾
检查更改后的公共void(开关按钮视图,布尔b检查){
如果(b检查){
日志d(“按钮”,“灯亮”);
connection.tcpClient.sendMessage(“li1_1”);
}否则{
日志d(“按钮”,“灯关闭”);
connection.tcpClient.sendMessage(“li1_0”);
}
}
};
setOnCheckedChangeListener(switchListener);
}
私有void runThread(){
i=0;
新线程(){
公开募捐{
而(i++<1000){
试一试{
runOnUiThread(新的Runnable(){
@凌驾
公开募捐{
if(connection.tcpClient.getStatusFlag()){
Log.d(“主要”、“获得状态”);
updateUI();
connection.tcpClient.setStatusFlag(false);
}
}
});
睡眠(300);
}捕捉(中断异常e){
e、 printStackTrace();
}
}
}
}.start();
}
公共void updateUI(){
试一试{
switch.setOnCheckedChangeListener(null);
switch.setChecked(开关标志);
setOnCheckedChangeListener(switchListener);
}catch(NullPointerException e){e.printStackTrace();}
}
我不知道在哪里使用同步的。

Put

 runThread();
下面

switch.setOnCheckedChangeListener(switchListener);
也代替

switch.setChecked(lightFlag);

下面

switch.setOnCheckedChangeListener(switchListener);
也代替

switch.setChecked(lightFlag);


试过这个没有luck@user7434651你能分享整个班级吗?我找不到lightListener在哪里。lightFlag vs switchflag是另一个打字错误。请更正它,然后再试一次。尝试了这个否luck@user7434651你能分享整个班级吗?我找不到lightListener在哪里。lightFlag vs switchflag是另一个打字错误。请更正它,然后再试一次再次。使布尔变量可变使布尔变量可变